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?
find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -
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:
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.
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.
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
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
Cela gérera les chemins avec des espaces:
find ./ -type f -name "*.php" -o -name "*.html" -exec tar uvf myarchives.tar {} +