Зазвичай для видалення файлів з пробілами у їхньому імені файлу вам доведеться запустити:
$ 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
працює для двох текстових файлів?