Зазвичай для видалення файлів з пробілами у їхньому імені файлу вам доведеться запустити:
$ rm "file name"
але якщо я хочу видалити кілька файлів, наприклад:
$ find . -name "*.txt" | xargs rm
Це не видалить файли з пробілами.
Зазвичай для видалення файлів з пробілами у їхньому імені файлу вам доведеться запустити:
$ rm "file name"
але якщо я хочу видалити кілька файлів, наприклад:
$ find . -name "*.txt" | xargs rm
Це не видалить файли з пробілами.
Відповіді:
Ви можете сказати findі xargsобом використовувати нульові термінатори
find . -name "*.txt" -print0 | xargs -0 rm
або (простіше) використовувати вбудовану -deleteдіюfind
find . -name "*.txt" -delete
або (спасибі @kos)
find . -name "*.txt" -exec rm {} +
будь-який з них повинен дотримуватися ARG_MAXліміту системи без необхідності xargs.
ARG_MAXя також згадаю, що find . -name "*.txt" -exec rm {} \;це був би "безпечний постріл"
-print0повинен бути останнім варіантом (або принаймні після -name "*.txt"), інакше це вдарить до файлів, не обмежених*.txt ...
До речі, якщо ви використовували щось інше, ніж find, ви можете використовувати tr для заміни нових рядків нульовими байтами.
Напр. наступний лайнер видаляє 10 останніх модифікованих файлів у каталозі, навіть якщо вони мають пробіли у своїх іменах.
ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm
Команда xargs використовує вкладки, пробіли та нові рядки як роздільники за замовчуванням. Ви можете сказати йому використовувати лише символи нового рядка ('\ n') з опцією -d:
find . -name "*.txt" | xargs -d '\n' rm
-0замість -d(для xargs) для систем BSD. Що використовує Ubuntu? Тут прийнята відповідь -0. Що правильно?
find -name "*\ *.txt" | xargs rmпрацює для двох текстових файлів?