passando variabili da 'ls' a 'tar' tramite 'xargs'


9

Sto cercando di fare qualcosa del genere

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

per archiviare gli ultimi 3 file modificati, ma finisce per eseguire separatamente il comando tar per ciascuno dei file e alla fine mi rimane un file tar contenente l'ultimo dei 3 file (nell'ordine che preferiscono). So che non sto usando 'xargs' correttamente ma la ricerca non ha aiutato; Trovo esempi che non funzionano neanche. Anche il comando più semplice

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

finisce con un file tar che contiene solo uno dei file in quella directory.

Risposte:


8

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

Per me va bene. C'è un motivo per cui è necessario -Iimpostare la bandiera?


Non mi è mai venuto in mente di provarlo; grazie mille! E se volessi davvero passarli con -I? C'è un modo per formattarlo correttamente in quel modo?
oligilo,

Se si desidera utilizzare la -Ibandiera, è necessario utilizzare qualcosa di diverso da quello {}per la sostituzione. Ad esempiols -t | head -n 3 | xargs -I foo tar -cf t.tar foo
David King,

L'ho fatto, ma sto ottenendo lo stesso risultato: solo l'ultimo file o, equivalentemente, esegue il comando tar separatamente per ogni elemento.
oligilo,

Dopo ulteriori letture nella pagina man di xargs ... -Iimplica -L 1che significa effettivamente eseguire il seguente comando per ogni 1 riga di input, motivo per cui stai vedendo i risultati che stai.
David King,

Ah, capisco; Grazie mille per il vostro aiuto; mi infastidiva da giorni. Lo apprezzo molto.
oligilo,

0

Secondo questo post , è meglio usare rinvece c, nel caso in cui xargstaglia gli input, producendo un file tar contenente solo l'ultimo pezzo. Quindi una soluzione migliore sarebbe:

rm -f t.tar 2>/dev/null  # remove tar if there
ls -t | head -n 3 | xargs tar -rf t.tar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.