Piping find -name до xargs призводить до назви файлів з пробілами, які не передаються команді


26

Зазвичай для видалення файлів з пробілами у їхньому імені файлу вам доведеться запустити:

$ rm "file name"

але якщо я хочу видалити кілька файлів, наприклад:

$ find . -name "*.txt" | xargs rm

Це не видалить файли з пробілами.


Повна здогадка тут: чи find -name "*\ *.txt" | xargs rmпрацює для двох текстових файлів?
TheWanderer

Відповіді:


49

Ви можете сказати findі xargsобом використовувати нульові термінатори

find . -name "*.txt" -print0 | xargs -0 rm

або (простіше) використовувати вбудовану -deleteдіюfind

find . -name "*.txt" -delete

або (спасибі @kos)

find . -name "*.txt" -exec rm {} +

будь-який з них повинен дотримуватися ARG_MAXліміту системи без необхідності xargs.


1
Не можу підняти це вдвічі жорсткіше :), оскільки ви згадали, ARG_MAXя також згадаю, що find . -name "*.txt" -exec rm {} \;це був би "безпечний постріл"
kos

3
Так говорить господар: завжди пам’ятайте xargs -0.
Джошуа

1
Супер важливий момент: -print0повинен бути останнім варіантом (або принаймні після -name "*.txt"), інакше це вдарить до файлів, не обмежених*.txt ...
Кев

1

До речі, якщо ви використовували щось інше, ніж find, ви можете використовувати tr для заміни нових рядків нульовими байтами.

Напр. наступний лайнер видаляє 10 останніх модифікованих файлів у каталозі, навіть якщо вони мають пробіли у своїх іменах.

ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm


Так, це працює.
Пітер Мортенсен

0

Команда xargs використовує вкладки, пробіли та нові рядки як роздільники за замовчуванням. Ви можете сказати йому використовувати лише символи нового рядка ('\ n') з опцією -d:

find . -name "*.txt" | xargs -d '\n' rm

Відповідь джерела на SO .


Ця відповідь зазначає -0замість -d(для xargs) для систем BSD. Що використовує Ubuntu? Тут прийнята відповідь -0. Що правильно?
Пітер Мортенсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.