Ответ 1
Возможно, проще всего использовать xargs
. В вашем случае:
ls -1 | xargs -L1 echo
Предположим, что у меня есть некоторый вывод из команды (например, ls -1
):
a
b
c
d
e
...
Я хочу применить команду (скажем echo
) к каждой из них. Например.
echo a
echo b
echo c
echo d
echo e
...
Какой самый простой способ сделать это в bash?
Возможно, проще всего использовать xargs
. В вашем случае:
ls -1 | xargs -L1 echo
Вы можете использовать базовую операцию добавления в каждой строке:
ls -1 | while read line ; do echo $line ; done
Или вы можете передать вывод в sed для более сложных операций:
ls -1 | sed 's/^\(.*\)$/echo \1/'
Вы можете использовать для цикла:
for file in * ; do echo "$file" done
Обратите внимание, что если рассматриваемая команда принимает несколько аргументов, использование xargs почти всегда более эффективно, так как оно должно полезной информации один раз вместо нескольких раз.
Фактически вы можете использовать sed для этого, если это GNU sed.
... | sed 's/match/command \0/e'
Как это работает:
for s in `cmd`; do echo $s; done
Если cmd имеет большой вывод:
cmd | xargs -L1 echo
Лучший результат для меня:
ls -1 | xargs -L1 -d "\n" CMD
xargs терпит неудачу с обратными косыми чертами, кавычками. Это должно быть что-то вроде
ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file."
xargs -0:
-0, --null Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.
ls -1
завершает элементы с символами новой строки, поэтому tr
преобразует их в нулевые символы.
Этот подход примерно в 50 раз медленнее, чем итерация вручную с помощью for ...
(см. ответ Майкла Аарона Сафьяна) (3.55s против 0,066s). Но для других входных команд, таких как поиск, поиск, чтение из файла (tr \\n \\0 <file
) или подобное, вы должны работать с xargs
следующим образом.