Linux gzip plusieurs sous-répertoires dans des archives distinctes?

16

Comment pourrais-je compresser des sous-répertoires dans des archives distinctes?

Exemple:

directory
 subdir1
 subdir2

Doit créer subdir1 (.tar) .gz et subdir2 (.tar) .gz

EarthMind
la source

Réponses:

27

Ce petit script semble être votre meilleure option, compte tenu de vos besoins:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

Il gère correctement les répertoires avec des espaces dans leurs noms.

Juliano
la source
Cela me donne cette erreur: bash: -c: ligne 1: erreur de syntaxe: fin de fichier inattendue
EarthMind
@EarthMind: Cela fonctionne bien ici. Vérifiez si le script a été copié correctement.
Juliano
@EarthMind: Je ne suis pas sûr que vous ayez bien expliqué la question d'origine. Vous souhaitez exécuter à nouveau cela et obtenir de nouveaux fichiers .tar.gz tout en laissant les fichiers .tar.gz précédents seuls? Essayez d'ajouter "tmstamp = $ (date '+% Y% m% d-% H% M')" et remplacez $ {base} par $ {base} - $ {tmstamp}.
freiheit
2
@EarthMind: si vous allez tout mettre sur une seule ligne, assurez-vous qu'il y a un point-virgule (;) juste avant la commande tar. Sinon, la base est passée en tant que variable d'environnement à tar, au lieu d'être une variable auxiliaire du shell.
Juliano
@mwojtera, votre tentative d'édition devrait être sa propre réponse
poussins
10

Que dis-tu de ça: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

Explication: vous exécutez une recherche sur tous les éléments du répertoire en cours. Maxdepth 0 ne le rend pas récursif plus bas que les arguments donnés. (Dans ce cas *, ou tous les éléments de votre répertoire actuel) L'argument 'd' de "-type" ne correspond qu'aux répertoires. Ensuite, exec exécute tar sur toutes les correspondances. ({} est remplacé par le fichier correspondant)

Christopher Karel
la source
1
Mais je reçois toujours l'erreur que le chemin donné est un répertoire et non un fichier
EarthMind
3
gzip seul n'archive pas les répertoires
Juliano
Vous devez tarer les répertoires avant de pouvoir les compresser.
ℝaphink
1
Vous avez besoin de tar avec l'option z, pas de gzip direct pour les répertoires. Très belle utilisation de find, cependant.
freiheit
3
Erreur: "find: les chemins doivent précéder l'expression:;" La première partie fonctionne, j'ai donc utilisé (répertoires uniquement): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
JosephK
4

Cela créera un fichier appelé blah.tar.gz pour chaque fichier d'un répertoire appelé blah.

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

Si vous avez plus que de simples répertoires dans le répertoire (c'est-à-dire des fichiers également, car ls retournera tout dans le répertoire), alors utilisez ceci:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

Le grep -v exclut le répertoire courant qui apparaîtra findpar défaut dans la commande.

Philip Reynolds
la source
3
Ls et find n'ont PAS été conçus pour être utilisés de cette manière. Particulièrement ls, il est destiné à présenter les fichiers dans une liste lisible par l'utilisateur, et non à générer des listes de fichiers comme arguments pour 'for'. Il suffit d'utiliserfor dir in *
Juliano
1
J'ai essayé votre première suggestion, mais elle ne fonctionne pas avec les répertoires contenant des espaces dans leur nom
EarthMind
De plus, la première commande crée également une archive tar pour chaque fichier du répertoire.
ℝaphink