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

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.


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)


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.