2017-09-18 2 views
0

Je cherche un moyen d'archiver tous les fichiers de certains types de fichiers dans un fichier zip par sous-dossier.Compresser tous les fichiers de certains types de fichiers dans des sous-dossiers dans un fichier par sous-dossier en utilisant shell script ou AppleScript


Ma structure de dossier est la suivante:

/path/to 
    └── TopLevel 
     ├── SubLevel1 
     │   ├── SubSubLevel1 
     │   ├── SubSubLevel2 
     │   └── SubSubLevel3 
     ├── SubLevel2 
     │   ├── SubSubLevel1 
     │   ├── SubSubLevel2 
     │   └── SubSubLevel3 
     ├── SubLevel3 
     │   ├── SubSubLevel1 
     │   └── SubSubLevel2 
     └── SubLevel4 

Dans chaque dossier ou sous-dossier ou sous-sous-dossier, il y a des fichiers du type de fichier * .abc, * .xyz et aussi * .001 à * .999 et tous ces fichiers je veux compresser dans un fichier zip par dossier, à savoir tous les fichiers des types spécifiés dans le dossier "SubSubLevel1" de "SubLevel1" de "TopLevel" devraient être empaquetés dans un fichier nommé "Sub SubLevel1_data.zip "dans le dossier" SubSubLevel1 ". Tous les autres fichiers de ces dossiers, qui ne correspondent pas aux critères de recherche décrits ci-dessus, doivent être conservés dans le même répertoire. J'ai trouvé quelques idées here ou here, mais les deux approches sont basées sur une manière différente d'archiver les fichiers et je n'ai pas encore trouvé un moyen de les adopter à mes besoins car je ne suis pas très expérimenté avec les scripts shell . J'ai également essayé d'obtenir une solution avec AppleScript, mais là je fais face au problème comment obtenir tous les dossiers dans le dossier avec le numéro comme extension (* .001 à * .999). Avec RegEx, je ferais quelque chose comme ".abc | .xyz. \ D \ d \ d" qui couvrirait ma recherche de certains types de fichiers, mais je ne suis pas sûr maintenant comment implémenter le résultat d'un grep dans AppleScript.

Je suppose que quelqu'un là-bas doit avoir une idée de comment résoudre mon problème d'archivage. Merci en avance pour vos suggestions.

Répondre

0

Après un certain jeu autour je suis venu avec la solution suivante:

#!/bin/bash 

shopt -s nullglob 

find -E "$PWD" -type d -maxdepth 1 -regex ".*201[0-5][0-1][0-9].*" -print0 | while IFS="" read -r -d "" thisFolder ; do 
    echo "The current folder is: $thisFolder" 
    to_archive=("$thisFolder"/*.[Aa][Bb][Cc] "$thisFolder"/*.[Xx][Yy][Zz] "$thisFolder"/*.[0-9][0-9][0-9]) 

    if [ ${#to_archive[@]} != 0 ] 
    then 
    7z a -mx=9 -uz1 -x!.DS_Store "$thisFolder"/"${thisFolder##*/}"_data.7z "${to_archive[@]}" && rm "${to_archive[@]}" 
    fi 

    find "$thisFolder" -type d -mindepth 1 -maxdepth 1 -print0 | while IFS="" read -r -d "" thisSubFolder ; do 
    echo "The current subfolder is: $thisSubFolder" 
    to_archive=("$thisSubFolder"/*.[Aa][Bb][Cc] "$thisSubFolder"/*.[Xx][Yy][Zz] "$thisSubFolder"/*.[0-9][0-9][0-9]) 

    if [ ${#to_archive[@]} != 0 ] 
    then 
     7z a -mx=9 -uz1 -x!.DS_Store "$thisSubFolder"/"${thisSubFolder##*/}"_data.7z "${to_archive[@]}" && rm "${to_archive[@]}" 
    fi 
    done 
done 

Mon script a deux boucles imbriquées pour itérer à des sous-dossiers et sous-sous-dossiers. Avec "find" je cherche un motif regex afin de ne sauvegarder que les dossiers de 2010-2015. Tous les fichiers correspondant aux extensions spécifiées dans les dossiers sont compressés dans une archive cible par dossier.