Як швидко видалити папку з великою кількістю папок?


15

У мене папка з 266778 вкладеними папками. Як я можу її видалити?

я намагався

cd ~/.local/share/Trash/
sudo rm -rf *

але це займає багато часу Через 1 хвилину 25 секунд у режимі реального часу та 0,072 секунди часу користувач видалив лише 2500 папок. Таким чином, для видалення цієї папки знадобиться більше двох годин.

Чи є більш швидкий спосіб видалити цю папку? Чому існує така велика різниця між часом користувача та реальним часом?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Я використовую Linux 2.6.32 (Ubuntu 10.04.4 LTS).


Я щойно переглянув цю проблему і, схоже, деякі люди виявили, що rsync можна досить ефективно використовувати як інструмент "видалення багатьох файлів". Чи справді це швидше, залежить від вас.
Йохан

2
Для чого це варто: продуктивність при видаленні багатьох папок / файлів сильно залежить від файлової системи. На мій досвід, різниця при видаленні мільйонів невеликих файлів на ext3 (повільний) і XFS (швидкий) може становити години.
пдо

Якщо у вас часто є такий випадок, і ви можете планувати заздалегідь, використовуючи файлову систему на зразок btrfs та використовуючи підтомник, ви можете швидко прискорити роботу, просто скинувши цей підпункт.
ПлазмаHH

Тут ви можете знайти відповідь. Перл - найшвидший. unix.stackexchange.com/questions/37329/…
SDsolar

Відповіді:


17

Якщо ваша версія "find" реалізує підкоманду -delete, тоді ви можете спробувати

find directory -delete

В цьому випадку:

find ~/.local/share/Trash/ -delete

Деякі команди, наприклад, rm, виконують більшу частину своєї роботи в ядрі. У точності підпрограм файлової системи. Час, який витрачається на виконання системних викликів, враховується таким чином, тому, хоча ваша команда "rm" працює тривалий час, вона не робить великої роботи в користувальницькому режимі - системні виклики виконують більшу частину роботи.


+1; хоча це також видаляє батьківський dir, і я підозрюю, що ОП хотів лише видалити вміст папки Trash, а не саму папку
don_crissti

1
@don_crissti: добре зауваження. якщо ОП хотіла видалити лише підкаталоги під ~ / .local / share / Trash (а не файли 1-го рівня), то: find ~/.local/share/Trash/*/ -delete (звичайно, це також видалить файли (та dirs) у будь-якому з цих кошиків / * / subdir також)
Олів'є Дулак

2
+1 за пояснення дивної поведінкиtime
Мартін Тома

3
Це find directory -deleteсправді швидше, ніж rm -rf directory? Зрештою, вони виконують ту саму роботу, і це не два способи.
Жил "ТАК - перестань бути злим"

1
@Johan знайти дуже швидко. Ви коли-небудь отримували шанс дізнатися причину?
Харшдеп

20

Це залежить від вашого визначення швидко . Наведені тут відповіді дають хороше рішення для фактичного видалення каталогів з файлової системи, але якщо вам дійсно потрібно, це звільнити ім’я каталогу якнайшвидше, перейменування в тій же файловій системі є миттєвим:

{ mv directory directory.gone && rm -rf directory.gone; } &

Технічно це обман, оскільки я не прискорив фактичне видалення, але практично це дуже корисно: цей трюк я використовую весь час, тому мені не доведеться чекати повільних операцій видалення.


Чудово. Який ви використовуєте для цього весь час? Якщо ви це зробите багато, чи не існує небезпеки, що ви будете відставати, отримувати декілька 'directory.gone та не працювати? Я припускаю, що ви використовуєте суфікс типу "$$" або "% (дата ...)"
smci

1
Якщо мені потрібно, я, можливо, міг би використовувати mktemp з аргументами, які забезпечують його перебування в одній і тій же файловій системі. Але я не можу сказати, що зараз маю конкретний приклад.
kojiro

Яко так, дякую, mktempце те, що я намагався пам’ятати ...
smci

1

rm -rf directoryабо, rm -rf *звичайно, це найшвидший метод, якщо ваша локальна rmреалізація не порушена.

Використання findне дає переваг.

Буде це швидко чи повільно, головним чином залежить від файлової системи та впровадження ОС. Тож питання видається недоречним.

Як відомо, UFS і ZFS в Solaris дуже швидко справляються з цим завданням, оскільки обидві реалізації файлової системи включають затримку коду видалення фону, що викликає unlink()та rmdir()швидкі повернення дзвінків, навіть якщо супутній об'єкт займе більше часу.

З затримкою видалення фону в ядрі, оновлення каталогів також може бути виконано швидко, і це допоможе прискорити всю операцію.


Хоча можна пробачити за те, що думати про це, це насправді не так, як описано у цій відповіді .
Hitechcomputergeek

0

Це лише часткова відповідь, що проливає світло на три значення, які повертає команда; цитата з time(1)сторінки керівництва :

(i) минулий реальний час між викликом та завершенням, (ii) час CPU користувача (сума tms_utimeта tms_cutimeзначень у a struct tms, повернутої times(2)), та (iii) системний час CPU (сума tms_stimeта tms_cstimeзначень у a struct tmsяк повернуто times(2)) ".

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