Как использовать каналы для ссылки на стандартный вывод команды из стандартного ввода другой команды?

Я пытаюсь понять, как использовать стандартный вывод в качестве стандартного ввода другой команды. Чтобы проверить это, я пытаюсь использовать следующую команду, чтобы удалить все каталоги из текущей папки.

ls -d -- */ | rm -rf $1

Я ожидаю, что результат ls -d - * / будет передан на вход rm, но он не работает. Идеи?

4
задан 6 August 2012 в 23:00

4 ответа

Не все команды / программы будут напрямую принимать канальный ввод (включая rm). Кроме того, почему вы используете переменную подстановки bash $1 вне скрипта?

В общем случае вам нужно обратиться к xargs, утилите, цель которой - упростить такие сценарии, взяв list из stdin, а затем вызывать команду с элементами этого списка (разными способами).

Для того, что вы хотите сделать ... (используйте это с умом!): rm -rf * (или .) будет достаточно.

0
ответ дан 6 August 2012 в 23:00
find -maxdepth 1 -not -name ".*" -type d -print0 | xargs -n1 -0 rm -rf

-maxdepth 1 включают только текущий каталог. -not -name ".*" исключить скрытые каталоги. -type d включают только каталоги, а не файлы. find -print0, используемый с xargs -0, будет использовать файлы и каталоги, имена которых имеют странные символы. xargs -n1 выполняют команду (в данном случае rm) по одной строке за раз.

0
ответ дан 6 August 2012 в 23:00

В этом конкретном случае вы также можете использовать find:

find . -maxdepth 1 -type -d -exec rm -rf {} \;
0
ответ дан 6 August 2012 в 23:00

Два варианта:

ls -d -- */ | xargs rm -r

или

rm -r `ls -d -- */`

В прошлом xargs был необходим, потому что в списках аргументов командной строки было ограничение. xargs ставит разумное число для каждого выполнения и запускает данную команду несколько раз (в нем также есть несколько интересных вещей, которые помогут вам выполнять параллельное выполнение). Однако в последних ядрах это ограничение исчезло, поэтому более простая команда rm без канала будет работать нормально, хотя она будет использовать больше оперативной памяти, поэтому при наличии многих тысяч аргументов xargs все равно будет более эффективен.

Стоит отметить, что вам не нужно -f для rm, так как это необходимо, только если вы хотите, чтобы rm продолжался, когда файл не существует, или чтобы пропустить какие-либо интерактивные подтверждения. Поскольку вы говорите, что они существуют, безопаснее не указывать их, а затем обычный псевдоним -i избавит вас от случайного удаления файлов и каталогов, защищенных от записи.

0
ответ дан 6 August 2012 в 23:00

Другие вопросы по тегам:

Похожие вопросы: