У меня есть каталог с парой сотен тысяч файлов.
Я хочу удалить все файлы, но 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) сначала, чтобы предотвратить добавление дополнительных автоматически созданных файлов, пока вы пытаетесь удалить файлы. Вы можете переделать исходный каталог вручную, если это не произойдет автоматически, как в моем случае