Передача по каналу находит - имя к результатам xargs в именах файлов с пробелами, не передаваемыми команде

Обычно для удаления файлов с пробелами в их имени файла необходимо было бы работать:

$ rm "file name"

но если я хочу удалить несколько файлов, например:

$ find . -name "*.txt" | xargs rm

Это не удалит файлы с пробелами в них.

26
задан 12 September 2017 в 03:01

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.

49
ответ дан 23 November 2019 в 01:07

Кстати, при использовании чего-то другого, чем находят, можно использовать TR для замены новых строк пустыми байтами.

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

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

1
ответ дан 23 November 2019 в 01:07

Команда xargs использует вкладки, пробелы и новые строки как разделители по умолчанию. Можно сказать этому только использовать символы новой строки ('\n') с-d опцией:

find . -name "*.txt" | xargs -d '\n' rm

Исходный ответ на ТАК.

0
ответ дан 23 November 2019 в 01:07

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

Похожие вопросы: