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