Трубопровод и Xargs

Я пытаюсь удалить некоторые. class файл из каталога. Поэтому сначала мне надоело считать имеющиеся .class файл с помощью следующей команды (после перехода в каталог) -

$ find . -name *.class | wc -l   

Здесь я могу понять роль конвейерной обработки (|) - вывод find команда / процесс работает как вход wc команда (пожалуйста, поправьте меня, если я ошибаюсь). Вышеприведенная команда отлично работает для меня и выдает правильный вывод. Но когда я пытаюсь удалить все. class файлы с помощью следующей команды с конвейерной обработкой -

$ find . -name *.class | rm *  # case-1

тогда это не работает. Это показывает следующую ошибку -

rm: cannot remove `<a_directory_name>': Is a directory
rm: cannot remove `<an_another_directory_name>': Is a directory  

Но когда я использую xargs тогда это работает нормально -

$ find . -name *.class | xargs rm *  # case-2

Теперь мой вопрос: может кто-нибудь сказать мне, почему case-1 не работает, пока case-2 работает отлично?,

Заранее спасибо.

1 ответ

Решение

Причина, по которой Case-1 не работает, заключается в том, что rm не принимает аргументы через STDIN, он принимает аргументы или файлы для удаления как:

rm file_1 file_2

В то время как в случае 2 xargs принимает вывод find команда через STDIN и преобразует имена файлов в качестве аргументов для rm команда.

Пожалуйста, прочитайте man rm а также man xargs чтобы получить больше идеи по этому вопросу.

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