Tar une liste de fichiers qui n'existent pas tous

10

J'exécute une commande à partir d'un script comme

tar -c -f ar.tar a b c d

où b, c et d peuvent ne pas exister et peuvent être des répertoires. Les solutions que j'ai trouvées consistent à canaliser la sortie de ls -dvers grep, puis à la raccorder à la tarcommande, ou à activer des globes étendus pour @(a|b|c|d).

Y a-t-il une façon plus nette de procéder? Je suis sur Debian Wheezy, qui ne semble pas avoir de --includeparamètre.

gidyn
la source
Avez-vous une --ignore-failed-readoption?
Costas
1
J'ai essayé, j'ai quand même donné une erreur pour les fichiers qui n'existent pas du tout.
gidyn
1
Oui, un message d'erreur est présent mais l'archive est créée.
Costas

Réponses:

8

tu peux essayer

 tar cf ar.tar $(ls a b c d )

  • c pour créer
  • f ar.tar spécifier le fichier tar

  • $(ls a b c d) listera à stdin quels fichiers sont réellement présents (et donnera une erreur pour les autres)

Archemar
la source
2
tar cf ar.tar $(ls -d a b c d 2>/dev/null)fonctionne parfaitement .. mais je pense que c'est plus propre avec extglob
gidyn
maintenant je porte le script sur dash, donc non extglob- j'utilise le code dans mon commentaire ci
gidyn
1

S'il est correct d'avoir le chemin complet des fichiers dans l'archive tar, vous pouvez le faire:

tar -c -f ar.tar $(readlink -e a b c d)

L' -eoption de lien de lecture canonisera les noms de fichiers existants et ignorera silencieusement les autres.

Anthon
la source
Je suppose que cela pourrait fonctionner si je --strip-componentspendant l'extraction.
gidyn
0

Utilisation

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Explication

  1. Le premier paramètre est le répertoire que vous souhaitez rechercher.
  2. Par défaut, la findrécursivité.
  3. Le -oreprésente -or. Donc ci-dessus signifie rechercher ce caractère générique OU celui-ci. Si vous n'avez qu'un seul motif, alors pas besoin -o.
  4. Les guillemets autour du motif générique sont obligatoires.
Shital Shah
la source