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?
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.
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 -