Трубка 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

Исходный ответ на SO.

Кстати, если вы использовали что-то отличное от find, вы можете использовать tr, чтобы заменить символы новой строки нулевыми байтами.

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

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

Другие вопросы по тегам