удаление папок с пробелами в именах с помощью xargs [duplicate]

Почему 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/
11
задан 26 October 2016 в 14:31

3 ответа

Зафиксируйте его с помощью -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 опция)

24
ответ дан 23 November 2019 в 03:51

Для специфического удаления всех подкаталогов, имеющих пробелы на их имя, самая простая команда была бы:

find . -type d -name "* *" -exec rm -rf {} +

Это - тот же подход как один heemayl, уже предложенный, при этом единственная разница -name фильтрация.

2
ответ дан 23 November 2019 в 03:51

Вам не нужно 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 в случае необходимости.

17
ответ дан 23 November 2019 в 03:51

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

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