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