meneruskan variabel dari 'ls' ke 'tar' via 'xargs'

9

Saya mencoba melakukan sesuatu seperti

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

untuk mengarsipkan 3 file terakhir yang dimodifikasi tetapi akhirnya menjalankan perintah tar secara terpisah untuk masing-masing file dan pada akhirnya saya dibiarkan dengan satu file tar yang berisi 3 file terakhir (dalam urutan apa pun mereka). Saya tahu saya tidak menggunakan 'xargs' dengan benar tetapi pencarian tidak membantu; Saya menemukan contoh yang tidak berhasil juga. Bahkan perintah yang lebih sederhana

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

berakhir dengan file tar yang hanya berisi satu file di direktori itu.

oligilo
sumber

Jawaban:

8

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

Bekerja untukku. Apakah ada alasan Anda memerlukan -Iset bendera?

David King
sumber
Tidak pernah terpikir oleh saya untuk mencobanya; Terima kasih banyak! Tetapi bagaimana jika saya benar-benar ingin memberikannya kepada saya? Apakah ada cara untuk memformatnya dengan benar seperti itu?
oligilo
Jika Anda ingin menggunakan -Iflag maka Anda harus menggunakan sesuatu selain {}untuk replacestring. Misalnyals -t | head -n 3 | xargs -I foo tar -cf t.tar foo
David King
Ya, tapi saya mendapatkan hasil yang sama: hanya file terakhir atau, yang setara, menjalankan perintah tar secara terpisah untuk setiap item.
oligilo
Setelah membaca lebih lanjut di halaman manual xargs ... -Imenyiratkan -L 1yang secara efektif berarti menjalankan perintah berikut untuk setiap 1 baris input yang mengapa Anda melihat hasil Anda.
David King
Ah, saya mengerti; terima kasih banyak atas bantuannya; itu menggangguku selama berhari-hari. Saya sangat menghargai itu.
oligilo
0

Menurut posting ini , lebih baik menggunakan rdaripada c, jika xargsmemotong input, menghasilkan file tar yang hanya berisi potongan terakhir. Jadi solusi yang lebih baik adalah:

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