passage des variables de 'ls' à 'tar' via 'xargs'


9

J'essaye de faire quelque chose comme

ls -t | head -n 3 | xargs -I {} tar -cf t.tar {}

pour archiver les 3 derniers fichiers modifiés mais il finit par exécuter la commande tar séparément pour chacun des fichiers et à la fin je me retrouve avec un fichier tar contenant le dernier des 3 fichiers (dans leur ordre). Je sais que je n'utilise pas correctement 'xargs' mais la recherche n'a pas aidé; Je trouve des exemples qui ne fonctionnent pas non plus. Même la commande la plus simple

ls | xargs -I {} tar -cf t.tar {}

se retrouve avec un fichier tar qui ne contient qu'un seul des fichiers de ce répertoire.

Réponses:


8

ls -t | head -n 3 | xargs tar -cf t.tar

Travaille pour moi. Y a-t-il une raison pour laquelle vous avez besoin du -Ijeu de drapeaux?


Il ne m'est jamais venu à l'idée d'essayer cela; Merci beaucoup! Mais que faire si je voulais vraiment les passer avec -I? Existe-t-il un moyen de le formater correctement de cette façon?
oligilo

Si vous souhaitez utiliser l' -Iindicateur, vous devez utiliser autre chose que {}pour la chaîne de remplacement. Par exemplels -t | head -n 3 | xargs -I foo tar -cf t.tar foo
David King

Je l'ai fait, mais j'obtiens le même résultat: uniquement le dernier fichier ou, de manière équivalente, il exécute la commande tar séparément pour chaque élément.
oligilo

Après une lecture supplémentaire dans la page de manuel de xargs ... -Iimplique -L 1ce qui signifie effectivement exécuter la commande suivante pour chaque 1 ligne d'entrée, c'est pourquoi vous voyez les résultats que vous êtes.
David King

Ah, je vois; je vous remercie beaucoup pour votre aide; ça me dérangeait pendant des jours. J'apprécie vraiment cela.
oligilo

0

Selon cet article , il est préférable d'utiliser rau lieu de c, dans le cas où xargsles entrées sont coupées, produire un fichier tar contenant uniquement le dernier morceau. Une meilleure solution serait donc:

rm -f t.tar 2>/dev/null  # remove tar if there
ls -t | head -n 3 | xargs tar -rf t.tar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.