Übergeben von Variablen von 'ls' an 'tar' über 'xargs'

9

Ich versuche so etwas zu tun

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

Um die 3 zuletzt geänderten Dateien zu archivieren, wird der Befehl tar für jede der Dateien separat ausgeführt. Am Ende verbleibt eine TAR-Datei mit der letzten der 3 Dateien (in beliebiger Reihenfolge). Ich weiß, dass ich 'xargs' nicht richtig verwende, aber die Suche hat nicht geholfen. Ich finde Beispiele, die auch nicht funktionieren. Noch der einfachere Befehl

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

endet mit einer TAR-Datei, die nur eine der Dateien in diesem Verzeichnis enthält.

Oligilo
quelle

Antworten:

8

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

Funktioniert bei mir. Gibt es einen Grund, warum Sie das -IFlag setzen müssen?

David King
quelle
Es ist mir nie in den Sinn gekommen, das zu versuchen; ich danke dir sehr! Aber was ist, wenn ich sie wirklich mit -I weitergeben wollte? Gibt es eine Möglichkeit, es auf diese Weise richtig zu formatieren?
Oligilo
Wenn Sie das -IFlag verwenden möchten, sollten Sie etwas anderes als {}das Ersetzen verwenden. Zum Beispiells -t | head -n 3 | xargs -I foo tar -cf t.tar foo
David King
Ich habe es getan, aber ich erhalte das gleiche Ergebnis: Nur die letzte Datei oder äquivalent dazu wird der Befehl tar für jedes Element separat ausgeführt.
Oligilo
Nach weiterem Lesen in der xargs-Manpage ... -Iimpliziert dies, -L 1was effektiv bedeutet, dass Sie den folgenden Befehl für jede 1 Eingabezeile ausführen, weshalb Sie die Ergebnisse sehen, die Sie sind.
David King
Ah ich sehe; vielen Dank für deine Hilfe; es nervte mich tagelang. Ich weiß das wirklich zu schätzen.
Oligilo
0

Nach diesem Beitrag ist es besser , zu verwenden , rstatt c, bei xargsKoteletts auf die Eingaben, eine tar - Datei nur den letzten Brocken enthält ergibt. Eine bessere Lösung wäre also:

rm -f t.tar 2>/dev/null  # remove tar if there
ls -t | head -n 3 | xargs tar -rf t.tar
julianisch
quelle