web-dev-qa-db-fra.com

Comment tarer certains types de fichiers dans tous les sous-répertoires?

Je veux tar et tous les fichiers .php et .html d'un répertoire et de ses sous-répertoires. Si j'utilise

tar -cf my_archive *

cela désactive tous les fichiers, ce que je ne veux pas. Si j'utilise

tar -cf my_archive *.php *.html

il ignore les sous-répertoires. Comment puis-je le rendre tar récursivement mais n'inclure que deux types de fichiers?

65
user1566515

find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -

112
DeeDee

Une méthode est:

tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )

Il y a quelques mises en garde avec cette méthode cependant:

  1. Il échouera s’il existe des fichiers ou des répertoires contenant des espaces, et
  2. cela échouera s'il y a tellement de fichiers que la longueur maximale de la ligne de commande est saturée.

Une solution à ces problèmes pourrait consister à exporter le contenu de la commande find dans un fichier, puis à utiliser l'option "-T, --files-from FILE" dans tar.

9
Robin Sheat

Pour compresser plusieurs fichiers avec des modèles différents, nous pourrions les séparer par un espace et les ajouter tous au fichier gz, comme ceci:

tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json

cela ajoutera tous les fichiers .yml qui commencent par Alice à partir de n'importe quel sous-répertoire et ajouter tous les fichiers .json commençant par Bob à partir de n'importe quel sous-répertoire.

4
Sairam Krish

Les mettre dans un fichier

find . \( -name "*.php" -o -name "*.html" \) -print > files.txt

Puis utilisez le fichier comme entrée dans tar, utilisez -I ou -T en fonction de la version de tar utilisée

Utilisez h pour copier des liens symboliques

tar cfh my.tar -I files.txt 
0
Noam Geffen

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -I 'pigz -9' -cf target.tgz

pour multicœur ou juste pour un noyau:

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -czf target.tgz

0
dmitry_podyachev

Cela gérera les chemins avec des espaces:

find ./ -type f -name "*.php" -o -name "*.html" -exec tar uvf myarchives.tar {} +
0
Ian Reinhart Geiser