На этот вопрос уже есть ответ здесь:
Почему xargs не может удалять каталоги с пробелами в их именах и как это исправить?
76 find . -type d |xargs rm -rf
77 rm -rf fire\ hydrant/
78 rm -rf wine\ glass/
79 rm -rf tennis\ racket/
80 rm -rf traffic\ light/
81 rm -rf parking\ meter/
82 rm -rf teddy\ bear/
83 rm -rf sports\ ball/
84 rm -rf cell\ phone/
85 rm -rf stop\ sign/
86 rm -rf dining\ table/
87 rm -rf potted\ plant/
Зафиксируйте его с помощью -print0
в find
и xargs -0
в xargs
, чтобы сказать обеим командам использовать Нулевой символ в качестве разделителя вместо пространства:
find . -type d -print0 | xargs -0 rm -rf
Вот хорошее объяснение того, почему оно повреждается и как эта фиксация работает от Командная строка Linux William E. Shotts Jr .
Контакт С Забавными Именами файлов
подобные Unix системы позволяют встроенные пробелы (и даже новые строки!) в именах файлов. Это вызывает проблемы для программ как
xargs
что списки аргументов конструкции для других программ. Встроенное пространство будут рассматривать как разделитель, и получающаяся команда интерпретирует каждое разделенное пробелом слово как отдельный аргумент. Для преодоления этого найдите, и xarg позволяют дополнительное использование нулевого символа как разделитель аргумента. Нулевой символ определяется в ASCII как символ, представленный нулем числа (в противоположность, например, пробел, который определяется в ASCII как символ, представленный номером 32). Команда находки обеспечивает действие-print0, который производит разделенный от пустого указателя вывод, и команда xargs имеет - пустая опция, которая признает, что пустой указатель разделил вход. Here’s пример:find ~ -iname '*.jpg' -print0 | xargs --null ls -l
Используя эту технику, мы можем удостовериться, что все файлы, даже те, которые содержат встроенные пробелы на их имена, обрабатываются правильно.
(-0
короткая версия --null
опция)
Для специфического удаления всех подкаталогов, имеющих пробелы на их имя, самая простая команда была бы:
find . -type d -name "* *" -exec rm -rf {} +
Это - тот же подход как один heemayl, уже предложенный, при этом единственная разница -name
фильтрация.
Вам не нужно xargs
, find
самостоятельно может сделать это надежно с обработкой:
любой вид возможных имен файлов
без инициирования ARG_MAX
Если каталоги пусты, использовать -delete
действие:
find . -type d -delete
Если не пустой, использовать rm -r
в -exec
действие:
find . -type d -exec rm -r {} +
Если Вы настаиваете на том, чтобы использовать xargs
, для любых имен каталогов без новой строки на их имена можно использовать новую строку в качестве разделителя входящих аргументов:
find . -type d | xargs -d $'\n' rm -r
Лучший способ, получите файлы разделенный NUL и соглашение с ним с -0
опция xargs
:
find . -type d -name 'foo bar*' -print0 | xargs -0 rm -r
Для весь rm -r
используемый, добавить -f
т.е. сделайте rm -rf
в случае необходимости.