1

У меня в Linux есть каталог с более чем 10000 файлами, которые мне нужно удалить. Бег...

sudo rm -rf /var/tmp/*

Выдает сообщение об ошибке ...

sudo: unable to execute /bin/rm: Argument list too long

Решение этой проблемы заключается в запуске

sudo find /var/tmp | xargs sudo rm

Это работает только для файлов без пробелов в имени файла. Однако у некоторых файлов есть имена с пробелами, и они не удаляются. Например, если файл называется «Файл с пробелами в Name.dat», запуск команды выдаст мне ошибки, подобные этой ...

rm: cannot remove `/var/tmp/A': No such file or directory
rm: cannot remove `File': No such file or directory
rm: cannot remove `With': No such file or directory
rm: cannot remove `Spaces': No such file or directory
rm: cannot remove `in': No such file or directory
rm: cannot remove `the': No such file or directory
rm: cannot remove `Name.dat': No such file or directory

Как передать полный путь к файлу в xargs sudo rm, не разбивая имя файла.

2 ответа2

6

Скажите find и xargs использовать другой разделитель файлов:

find /var/tmp -print0 | sudo xargs -0 rm

Или скажите find чтобы выполнить rm напрямую:

sudo find /var/tmp -exec rm {} +

Или скажите find чтобы просто удалить файлы:

sudo find /var/tmp -delete

Примечание: -mindepth 1 может быть полезен, чтобы избежать удаления самого каталога /var/tmp .

... или на самом деле, просто опустите * , это не обязательно, если вы собираетесь использовать рекурсивный режим в первую очередь.

sudo rm -rf /var/tmp
1

Просто добавьте к предыдущему ответу, чтобы избежать проблем с удалением каталогов:

find /var/tmp -type f -exec sudo rm {} +

find /var/tmp -depth -type d -exec sudo rmdir {} +

rmdir -p также может использоваться для удаления всех потомков каталога вместо использования -depth.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .