Як я можу видалити всі файли з каталогу, коли він надсилає "Аргумент надто довгий"


11

У мене каталог з кількома сотнями тисяч файлів у ньому.

Я хочу видалити всі файли, але rm * -f повідомляє: "список аргументів занадто довгий"

Який найкращий спосіб очистити цей каталог?


Відповіді:


11

Якщо ви не можете видалити каталог, ви завжди можете використовувати find.

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

Це видалить усі файли в поточному каталозі та лише поточну директорію (не підкаталоги).


майже ідеально (дивіться теж мій пост)
asdmin

2
У Linux ви можете це зробити ще швидше, використовуючи "+" замість "\;". Це призведе до того, що він одночасно видалить більше файлів на "rm".
Томас

5
Ще швидше: find dir/to/delete -delete(Не породжує rmпроцес видалення для кожного файлу).
Morten Siebuhr

Мортен: Він ніколи не згадував, що бажає видалити сам каталог, а він сказав, що файли. find dir/to/delete -type f -delete
Річо

21
знайти. -maxdepth 1 -тип f -exec rm -f {} \;

це просто займає занадто багато часу (один екземпляр rm на файл).

цей набагато ефективніший:

знайти. -maxdepth 1 -тип f -принт0 | xargs -r0 rm -f

як це потрібно стільки імен файлів, скільки аргументувати rm, наскільки це можливо, тоді запускається rm з наступним завантаженням імен файлів ... може статися так, що rm викликається лише 2 або 3 рази.


5
Радий бачити, як хтось знає, як знайти твори ... Також розглянемо з новим gnu find дії -delete або команда -exec {} +, яка діє як xargs. Дивіться розділ "Дії знайти".
Кайл Брандт

Я не знав про -exec cmd {} +. Це виглядає досить корисно. Трохи більш загальний, ніж -delete :)
Девід Пашлі

-delete може бути добре, але я особисто віддаю перевагу командам, які можна використовувати на різних машинах. Системи Solaris, з якими я працюю, старші, тому -delete не буде працювати над ними
asdmin

2
Додавання ioniceлише раніше rm- це гарна ідея, якщо комп'ютер одночасно використовується іншими людьми.
Хуберт Каріо

6

Обидва ці проблеми вирішать проблему. Існує аналіз відповідної роботи кожного методу над тут .

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

або

ls WHATEVER | xargs rm -rf

Проблема випливає з розширення bash "*" з елементом everysingle в каталозі. Обидва ці рішення працюють по черзі через кожен файл.


2
Рішення пошуку є повільнішим для багатьох файлів, оскільки воно викликає команду rm для кожного окремого файлу. Рішення xargs швидше, але воно працює лише тоді, коли файли файлів не містять пробілів (інакше потрібно GNU find and find . -print0 | xargs -0 rm).
грабувати

"find. -name ШТО БУДЬ -print0 | xargs -0 rm -rf" буде більш ефективним. find буде fork rm для кожного файлу, де як xargs зменшить його до мінімуму. Вам потрібні -print0 і -0, щоб впоратися з файлами з пробілами. Ви, ймовірно, також хочете використовувати -depth при пошуку, так що це перший пошук по глибині.
Девід Пашлі

Команда ls не буде працювати, оскільки це теж повертає "аргумент списку занадто довгий"
Brent

2
Ви робите " ls *", і " *" розширюється до списку аргументів, що ваша оболонка скаржиться на те, що вона занадто довга. ls .Замість цього виконайте " " (або перейдіть на один рівень каталогу та виконайте " ls [dirname]").
James Sneeringer

другий командний рядок (ls WHATEVER | xargs rm -rf) не працюватиме з тієї ж причини, що і питання не спрацювало: WHATEVER буде замінено оболонкою на
більшу

3

Я зміг це зробити, створивши резервне копіювання одного рівня:

cd ..

І працює:

rm directory name -rf

А потім знову створити каталог.


1
він працює лише в тому випадку, якщо вам не потрібно постійно мати dir і всі файли та каталоги будуть рекурсивно видалятися. У більшості випадків у моєму житті цей спосіб не працював би.
asdmin

2

Усі ці виклики знаходять дуже приємно, але я рідко пам’ятаю саме ту номенклатуру, яка потрібна, коли я поспішаю: натомість я використовую ls. Як хтось згадує, лс. буде працювати, але я віддаю перевагу ls -1, як у:

лс -1 | xargs -n 100 rm -rf

Цифра -n xxx досить безпечна для розігрування з перевищенням максимуму або буде автоматично виправлена ​​(якщо розмір-макс перевищено; див.), Або якщо аргументи-макс для програми перевищені, зазвичай це буде досить очевидний.

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

Ця відповідь передбачає, що ви використовуєте утиліти Gnu core для своїх ls, xargs і т.д.


Чи буде це працювати з каталогом, який занадто великий для роботи "ls"? (така ж помилка - занадто довгий список аргументів)
Brent

Так Brent: просто не забудьте використати filepec при виклику ls. Використовуйте лише -1 (тире Один), як показано вище. І як пояснено вище, використовуйте grep після ls, якщо вам потрібно спарувати список файлів. Якщо ви отримуєте "занадто довгу" помилку після того, як переконайтеся, що ви не використовуєте жодні символи з ls, можливо, xargs скаржиться. Використовуйте "xargs -n 5" замість "xargs -n 100", і ви обов'язково повинні бути в безпеці, якщо трохи повільніше.
rixtertech

1

Ви можете скористатися -exec +опцією, щоб знайти, який буде намагатися запустити rm якомога менше разів, що може бути швидше.

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

0

Ось версія для видалення великої кількості файлів, коли системі потрібно залишатись у відповідь.

Він працює, видаючи роботу невеликими партіями (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

0

Вирішує помилки "занадто довгий аргумент" або "не може виділити пам'ять"

Це зробило трюк для 220 000+ файлів у папці сеансу ....

Перевага: миттєво починається видалення файлів

cd шлях / до / папки
ls -f | xargs rm -f -v

КЛІКНУЙТЕ для скріншоту видалених файлів - (видалено всі файли за ~ 15 хв)

-f (після ls) утримує від сортування

-v (після rm) відображає кожен файл як видалений

-f (після rm) не вимагає запитів на захищені від запису файли

Порада: спочатку перейменуйте папку (колишній сеанс до session_old), щоб уникнути додавання додаткових автогенерованих файлів під час спроби видалення файлів. Ви можете переробити оригінальний каталог вручну, якщо він не буде автоматично, як у моєму випадку


Що нового у вашій відповіді, що бракувало попередніх?
користувач2233709
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.