Обычно для удаления файлов с пробелами в имени файла вам нужно выполнить:
$ 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
работает ли для двух файлов слов?