Трубопровод и 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 чтобы получить больше идеи по этому вопросу.