Відповіді:
Якщо ви не можете видалити каталог, ви завжди можете використовувати find.
find . -maxdepth 1 -type f -exec rm -f {} \;
Це видалить усі файли в поточному каталозі та лише поточну директорію (не підкаталоги).
find dir/to/delete -delete(Не породжує rmпроцес видалення для кожного файлу).
find dir/to/delete -type f -delete
знайти. -maxdepth 1 -тип f -exec rm -f {} \;
це просто займає занадто багато часу (один екземпляр rm на файл).
цей набагато ефективніший:
знайти. -maxdepth 1 -тип f -принт0 | xargs -r0 rm -f
як це потрібно стільки імен файлів, скільки аргументувати rm, наскільки це можливо, тоді запускається rm з наступним завантаженням імен файлів ... може статися так, що rm викликається лише 2 або 3 рази.
ioniceлише раніше rm- це гарна ідея, якщо комп'ютер одночасно використовується іншими людьми.
Обидва ці проблеми вирішать проблему. Існує аналіз відповідної роботи кожного методу над тут .
find . -name WHATEVER -exec rm -rf {} \;
або
ls WHATEVER | xargs rm -rf
Проблема випливає з розширення bash "*" з елементом everysingle в каталозі. Обидва ці рішення працюють по черзі через кожен файл.
find . -print0 | xargs -0 rm).
ls *", і " *" розширюється до списку аргументів, що ваша оболонка скаржиться на те, що вона занадто довга. ls .Замість цього виконайте " " (або перейдіть на один рівень каталогу та виконайте " ls [dirname]").
Я зміг це зробити, створивши резервне копіювання одного рівня:
cd ..
І працює:
rm directory name -rf
А потім знову створити каталог.
Усі ці виклики знаходять дуже приємно, але я рідко пам’ятаю саме ту номенклатуру, яка потрібна, коли я поспішаю: натомість я використовую ls. Як хтось згадує, лс. буде працювати, але я віддаю перевагу ls -1, як у:
лс -1 | xargs -n 100 rm -rf
Цифра -n xxx досить безпечна для розігрування з перевищенням максимуму або буде автоматично виправлена (якщо розмір-макс перевищено; див.), Або якщо аргументи-макс для програми перевищені, зазвичай це буде досить очевидний.
Слід зазначити, що grep зручно вставляти в середину цього ланцюга, коли ви хочете лише видалити підмножину файлів у великому каталозі, а не з будь-якої причини хочете використовувати find.
Ця відповідь передбачає, що ви використовуєте утиліти Gnu core для своїх ls, xargs і т.д.
Ось версія для видалення великої кількості файлів, коли системі потрібно залишатись у відповідь.
Він працює, видаючи роботу невеликими партіями (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 (після rm) відображає кожен файл як видалений
-f (після rm) не вимагає запитів на захищені від запису файли
Порада: спочатку перейменуйте папку (колишній сеанс до session_old), щоб уникнути додавання додаткових автогенерованих файлів під час спроби видалення файлів. Ви можете переробити оригінальний каталог вручну, якщо він не буде автоматично, як у моєму випадку