Назад | Перейти на главную страницу

Как я могу удалить все файлы из каталога, если он сообщает «Слишком длинный список аргументов»

У меня есть каталог с парой сотен тысяч файлов.

Я хочу удалить все файлы, но rm * -f сообщает: "слишком длинный список аргументов"

Как лучше всего очистить этот каталог?

find . -maxdepth 1 -type f -exec rm -f {} \;

это просто занимает слишком много времени (один запуск rm на файл).

этот намного эффективнее:

find . -maxdepth 1 -type f -print0 | xargs -r0 rm -f

поскольку он принимает столько имен файлов, сколько аргумент для rm, насколько это возможно, затем запускает rm со следующей загрузкой имен файлов ... может случиться так, что rm вызывается только 2 или 3 раза.

Если вы не можете удалить каталог, вы всегда можете использовать find.

find . -maxdepth 1 -type f -exec rm -f {} \;

Это удалит все файлы в текущем каталоге и только текущий каталог (не подкаталоги).

Оба они решат проблему. Анализируется эффективность каждой техники. Вот.

find . -name WHATEVER -exec rm -rf {} \;

или

ls WHATEVER | xargs rm -rf

Проблема возникает из-за того, что bash расширяет "*" каждым элементом в каталоге. Оба этих решения работают с каждым файлом по очереди.

Я смог сделать это, сделав резервную копию на один уровень:

cd ..

И работает:

rm имя каталога -rf

А затем заново создайте каталог.

Все эти вызовы find очень хороши, но я редко вспоминаю точно необходимую номенклатуру, когда я спешу: вместо этого я использую ls. Как кто-то упоминает, ls. будет работать, но я предпочитаю ls -1, как в:

ls -1 | xargs -n 100 rm -rf

С цифрой -n xxx довольно безопасно играть, так как превышение максимума будет либо автоматически исправлено (если превышен size-max; см. -S), либо если превышено args-max для приложения, это обычно будет скорее очевидно.

Следует отметить, что grep удобно вставлять в середину этой цепочки, когда вы хотите удалить только подмножество файлов в большом каталоге и по какой-либо причине не хотите использовать find.

В этом ответе предполагается, что вы используете основные утилиты Gnu для ls, xargs и т. Д.

Вы можете использовать -exec + вариант, чтобы найти, который будет пытаться запустить rm как можно меньше раз, что может быть быстрее.

find . -type f -exec rm '{}' +

Вот версия для удаления большого количества файлов, когда система должна оставаться отзывчивой.

Он работает, выполняя работу небольшими партиями (по умолчанию 100 файлов) и немного ожидая завершения других заданий.

Прекрасно справился с удалением более полумиллиона файлов из одного каталога на ext3. Он печатает процент проделанной работы как небольшой бонус

noOfFiles=`ls -U | wc -l`
n=0
while (ls -U | tail -n 100 | xargs rm -f); do 
   n=$((n+100));
   sync;
   echo -en "$((n*100/noOfFiles))%, ($n of $noOfFiles)\r";
   sleep 5;
done

Устраняет ошибки типа "слишком длинный аргумент" или "не удается выделить память"

Это помогло 220 000+ файлов в папке сеанса ....

Преимущество: мгновенно начинает удаление файлов

cd путь / к / папке
ls -f | xargs rm -f -v

НАЖМИТЕ, чтобы увидеть снимок удаляемых файлов - (удалил все файлы за ~ 15 мин)

-f (после ls) удерживается от предварительной сортировки

-v (после пм) отображает каждый файл как удаляемый

-f (после пм) проходит без запроса на защищенные от записи файлы

Наконечник: Переименовать папку (от сеанса до session_old) сначала, чтобы предотвратить добавление дополнительных автоматически созданных файлов, пока вы пытаетесь удалить файлы. Вы можете переделать исходный каталог вручную, если это не произойдет автоматически, как в моем случае