передача переменных из 'ls' в 'tar' через 'xargs'

9

Я пытаюсь сделать что-то вроде

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

чтобы заархивировать 3 последних измененных файла, но в итоге выполняется команда tar отдельно для каждого из файлов, и в конце я остаюсь с одним файлом tar, содержащим последний из 3 файлов (в любом порядке). Я знаю, что неправильно использую xargs, но поиск не помог; Я нахожу примеры, которые тоже не работают. Даже более простая команда

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

заканчивается файлом tar, который содержит только один из файлов в этом каталоге.

oligilo
источник

Ответы:

8

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

Работает для меня. Есть ли причина, по которой вам нужен установленный -Iфлаг?

Дэвид Кинг
источник
Мне никогда не приходило в голову попробовать это; Спасибо вам большое! Но что, если я действительно хочу передать их с -I? Есть ли способ правильно отформатировать его?
oligilo
Если вы хотите использовать -Iфлаг, вам следует использовать что-то другое, чем {}для строки замены. Напримерls -t | head -n 3 | xargs -I foo tar -cf t.tar foo
Дэвид Кинг
Я сделал, но я получаю тот же результат: только последний файл или, что то же самое, он запускает команду tar отдельно для каждого элемента.
oligilo
После дальнейшего прочтения на справочной странице xargs ... -Iподразумевается, -L 1что фактически означает выполнение следующей команды для каждой 1 строки ввода, поэтому вы видите результаты, которые вы есть.
Дэвид Кинг
Ах я вижу; большое вам спасибо за вашу помощь; это беспокоило меня в течение нескольких дней. Я очень ценю это.
oligilo
0

Согласно этому сообщению , то лучше использовать rвместо c, в случае xargsкрошит входы, что дает архивный файл , содержащий только последний кусок. Так что лучшим решением будет:

rm -f t.tar 2>/dev/null  # remove tar if there
ls -t | head -n 3 | xargs tar -rf t.tar
юлианский
источник