Трубопровідна та xargs


0

Я намагаюся видалити деякі. 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працює добре? .

Заздалегідь спасибі.

Відповіді:


2

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

rm file_1 file_2

Тоді як у Case-2 xargsприймається вихід findкоманди через STDIN і перетворює назви файлів як аргументи для rmкоманди.

Будь ласка, прочитайте man rmта man xargsотримайте більше уявлень щодо цього.


Тут STDIN означає клавіатуру?
Разиб

1
@Razib: Тут STDIN приймає поняття потоків даних, STDIN - дескриптор файлів 0, це в основному означає, що тут дані вводяться в програму. Тут труба |передає команду STDOUT findкоманді STDIN xargsкоманди.
heemayl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.