web-dev-qa-db-fra.com

goudron avec motif --include

Ce qui suit est un extrait d'un script que j'ai qui essaie de tarer tous les fichiers php dans un sous-répertoire. Il essaie d'utiliser le paramètre '--include' mais ne semble pas fonctionner (la sortie provient de 'set -x' dans bash)

+ find . -name '*.php'
./autoload.php
./ext/thrift_protocol/run-tests.php
./protocol/TBinaryProtocol.php
...
./transport/TTransportFactory.php
+ tar -cvjf my.tar.bz2 '--include=*.php' .
+ set +x

find a trouvé plusieurs fichiers php mais tar ne semble pas les voir. Si je retire le --include tous les fichiers sont goudronnés.

Je sais que je peux utiliser find pour alimenter une liste (find . -name '*.php' -print0 | tar -cvjf "my.tar.bz2" --null -T -), mais qu'est-ce qui ne va pas avec le --include param?

29
nhed

En fait, je viens de regarder tar(1) sur mon système freebsd et j'ai trouvé une option --include (plus tôt, j'avais consulté une vieille page de manuel en ligne). Les options --include Sont assez puissantes. Voici quelques exemples

Ce sont les fichiers

cnicutar@uranus ~/tar_test $ ls -1
a.c
b.c
x

Tar simple, tout archiver

cnicutar@uranus ~/tar_test $ tar -cvf archive1.tar *
a a.c
a b.c
a x

Archiver uniquement les fichiers C

cnicutar@uranus ~/tar_test $ tar -cvf archive2.tar --include='*.c' *
a a.c
a b.c

Donc, ce qui est probablement faux dans votre script, c'est que vous donnez tar . Au lieu de .* Comme dernier argument.

MODIFIER

Je l'ai essayé et j'ai été surpris. Le comportement de tar(1) est inattendu mais (je crois) voulu. La page de manuel indique:

Process only files or directories that match the specified pattern.

Ainsi, lorsque vous spécifiez le modèle, il filtre tous les répertoires qui ne le correspondent pas. Donc, si vos répertoires ne possèdent pas cette extension (elle est valide mais peu commune) elle n'y descendra pas (même si au fond, il pourrait y avoir des fichiers "intéressants").

Donc, en conclusion, je pense qu'il serait préférable d'utiliser une autre façon d'énumérer récursivement les fichiers + filtre.

7
cnicutar

GNU tar a un T ou -- files-from option qui peut prendre un fichier contenant une liste de modèles à inclure. Le fichier spécifié avec cette option peut être "-" pour stdin. Ainsi, vous pouvez passer une liste arbitraire de fichiers que tar doit archiver depuis stdin en utilisant files-from -. Votre exemple devient:

find . -name '*.php' | tar -cvjf my.tar.bz2 --files-from -
79
Nicholas Sushkin