Skip to content

Instantly share code, notes, and snippets.

@parmentf
Last active December 13, 2019 16:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parmentf/bf6102740902aca6d791d3728fa2e8ad to your computer and use it in GitHub Desktop.
Save parmentf/bf6102740902aca6d791d3728fa2e8ad to your computer and use it in GitHub Desktop.
Extraction de fichiers à partir de fichiers zip et de noms de fichiers

Extraction de fichiers

Ce script est destiné à extraire de plusieurs .zip contenant un répertoire avec des notices, dont les fichiers contiennent l'identifiant, les notices dont les identifiants sont donnés dans un fichier d'identifiants.

Structure des fichiers d'entrée

$ unzip -l crossref-2017.zip
Archive:  crossref-2017.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2019-01-30 14:12   2017/
     6874  2019-01-30 13:31   2017/10.1016_j.bulcan.2017.05.002.xml
     3673  2019-01-30 12:43   2017/10.2217_fon-2016-0441.xml
     2931  2019-01-30 13:57   2017/10.1016_j.actpha.2017.07.001.xml
    18155  2019-01-30 13:29   2017/10.1084_jem.20170229.xml
...
    10096  2019-01-30 12:42   2017/10.1093_jac_dkw437.xml
     2318  2019-01-30 14:05   2017/10.4000_insitu.15606.xml
    35323  2019-01-30 14:01   2017/10.1186_s12885-017-3794-3.xml
    19636  2019-01-30 13:58   2017/10.1073_pnas.1703790114.xml
---------                     -------
1604000585                     93072 files

Tous les fichiers d'entrées doivent avoir un début de nom de fichier en commun (ex: crossref-2017.zip, crossref-2016.zip, où crossref est en commun).

En effet, c'est ce début commun qui formera le début du nom du fichier résultant.

Par exemple, il vaut mieux utiliser crossref que crossref-201 comme premier paramètre de la commande, car crossref produire un fichier crossref_extrait.zip alors que crossref-201 (donné par la complétion de bash) donnerait crossref-201_extrait.zip (moins compréhensible humainement).

Usage

On donne en premier paramètre une partie commune au début de tous les fichiers .zip dans lesquels on va chercher les notices.

En deuxième paramètre, on donne le nom du fichier texte qui contient les identifiants (partie discrimante des noms des fichiers à extraire), en en mettant un par ligne.

$ ./extrait.sh hal hal_428.txt
$ ll -h hal_*
-rw-rw-r-- 1 parmentf parmentf 5,6K déc.  13 14:41 hal_428.txt
-rw-r--r-- 1 parmentf parmentf 1,2M déc.  13 15:32 hal_extrait.zip
#!/usr/bin/env bash
if [ $# -ne 2 ]
then
echo "Mauvais nombre d'arguments."
echo
echo "Usage: ${0} débutDeFichiersZip fichierIdentifiants.txt"
echo " Les fichiers zip doivent contenir un répertoire."
echo
echo "Exemple: ${0} FICHIERS_TEI_CROSSREF_ARTICLES crossref_371.txt"
echo
exit 1
fi
inputFilesBeginning=$1
identifiers=$2
for inputFile in ${inputFilesBeginning}*.zip
do
# On extrait les chemins des fichiers d'après les identifiants
files=$(
unzip -l "${inputFile}" | \
grep -f "${identifiers}" | \
cut -c31- | \
xargs echo
)
# On dézippe chaque fichier extrait
for file in $files
do
unzip -q "$inputFile" "$file"
done
outputDir=$(
echo "$files" | \
cut -d'/' -f1
)
outputFile="${inputFilesBeginning}_extrait.zip"
# On ajoute le répertoire du fichier d'entrée contenant les fichiers à
# extraire dans le zip de sortie
zip -qr "$outputFile" "$outputDir"
rm -rf "$outputDir"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment