Як ви видаляєте в Unix все, що знаходиться в поточному каталозі та під ним?


108

Я знаю, що це видалить усе у підкаталозі та під ним:

rm -rf <subdir-name>

Але як ви видалите все з поточного каталогу, а також кожен підкаталог під ним та вміст усіх цих підкаталогів?


2
Це повинно бути обманутим: stackoverflow.com/questions/550922 / ...
jmucchiello

Відповіді:


166

Практикуйте безпечні обчислення. Просто перейдіть на один рівень в ієрархії та не використовуйте виразного символу:

cd ..; rm -rf -- <dir-to-remove>

Два тире --говорять, rmщо <dir-to-remove>це не варіант командного рядка, навіть коли він починається з тире.


8
Чому це безпечніше?
Ієн

34
Оскільки ви конкретно співпадаєте з названим каталогом і, таким чином, менше шансів видалити те, що ви не збираєтесь видаляти.
tvanfosson

5
Правда. Я міг бачити, як це роблю досить легко.
Ієна

26
чи він також не видаляє сам каталог? Ви повинні зробити mkdir <dir-to-remove> після цього. Але тоді будь-яке тверде посилання, що посилається на цей каталог, згодом буде окремим каталогом.
Йоханнес Шауб - ліб

5
@Yen, якщо ви використовуєте, rm ./ви можете випадково набрати, rm . /що може стати катастрофою.
ірфандар

44

Видалить усі файли / каталоги нижче поточного.

find -mindepth 1 -delete

Якщо ви хочете зробити те ж саме з іншим каталогом, ім'я якого у вас є, ви можете просто назвати його

find <name-of-directory> -mindepth 1 -delete

Якщо ви хочете видалити не лише підкаталоги та файли з нього, а й сам каталог, опустіть -mindepth 1. Зробіть це без того, -deleteщоб отримати список речей, які буде видалено.


Мені потрібно було видалити всі файли в підкаталогах, але я не хотів видаляти самі підкаталоги. find <name-of-direcotry> -mindepth 2 -delete відмінно працював!
Тім Дірборн

Вам потрібно, -mindepth 1якщо ви вказуєте каталог ( find <name-of-directory> -mindepth 1 -delete). В іншому випадку Йоханнес має рацію, він не видалить поточну робочу директорію (при використанні find -delete).
Weboide

IMO, це найкраща відповідь, особливо в сценаріях.
wizonesolutions

1
Я пробував: find -mindepth 1 -deleteале я отримав , illegal option -- mале він працював чудово , коли я витягував варіант mindepth find . -delete
Sharon

41

Те, що я завжди роблю, - це тип

rm -rf *

а потім натисніть ESC- * , і bash розширить * до явного списку файлів і каталогів у поточному робочому каталозі.

Переваги:

  • Я можу переглянути список файлів, які потрібно видалити, перш ніж натиснути ENTER.
  • Історія команд не буде містити "rm -rf *" з незаміщеним символом, який може бути випадково використаний у неправильному місці в неправильний час. Натомість історія команд буде містити фактичні імена файлів.
  • Також стало зручно один чи два рази відповісти "зачекай секунду ... які файли я тільки видалив?". Імена файлів видно в буфері прокрутки термінала або в історії команд.

Насправді мені це так подобається, що я зробив це поведінкою TAB за замовчуванням за допомогою цього рядка в .bashrc:

bind TAB:insert-completions

Відсутній --у цій відповіді? Я мушу сказати, що цей підхід є надзвичайно загальним.
Ben Voigt

кращий спосіб - це запустити
судо

22

Використовуйте

rm -rf *

Оновлення: .стоїть для поточного каталогу, але ми не можемо ним скористатися. Здається, що команда має явні перевірки на .і.. . Використовуйте замість шаблону підстановки. Але це може бути ризиковано.

Більш безпечною версією IMO є використання:

rm -ri * 

(це вимагає підтвердження перед видаленням кожного файлу / каталогу.)


13
"Може бути ризикованим" надзвичайно лаконічно.

5
Роблячи такі речі, я знайшов швидкий ls -r. спочатку дозволяє вам побачити, що ви збираєтесь видалити. Корисно швидко дати зрозуміти, що ви не збираєтесь видаляти весь диск ...
Rich Bradshaw

2
Чому це ризикованіше, ніж rm -rf <subdir-name>?
Ієна

2
@Yen - адже якщо ви зробите це в неправильному місці, ви можете отримати катастрофічні результати. Використання конкретного імені в неправильному місці може помилитися лише в тому випадку, якщо там буде той самий підкаталог.
tvanfosson

1
Ви, можливо, не можете видалити батьків, перебуваючи в ньому.
брудно

6

Це правильно, що rm –rf .буде видалено все в поточному безпосередньо, включаючи будь-які підкаталоги та їх вміст. Одна точка ( .) означає поточний каталог. будьте обережні, щоб цього не робити, rm -rf ..оскільки подвійна крапка ( ..) означає попередній каталог.

Це означає, що якщо ви схожі на мене і у вас одночасно відкрито кілька вікон терміналів, вам краще бути в безпеці і скористайтеся rm -ir .Давайте подивіться на аргументи команд, щоб зрозуміти, чому.

По-перше, якщо ви подивитеся на сторінку rmкоманди команд ( man rmпід більшістю Unix), ви помітите, що це –rозначає "видаляти вміст каталогів рекурсивно". Отже, виконуючи rm -r .поодинці, вилучите все з поточного каталогу та все нижче.

У rm –rf .доданому -f означає "ігнорувати неіснуючі файли, ніколи не підказуючи". Ця команда видаляє всі файли та каталоги в поточному каталозі і ніколи не вимагає підтвердити, що ви дійсно хочете це зробити. -fособливо небезпечно, якщо ви запускаєте команду під привілеєм користувача, оскільки ви можете видалити вміст будь-якого каталогу, не отримуючи шанс переконатися, що це дійсно те, що вам потрібно.

З іншого боку, у rm -ri .тому, -iщо замінює -fзасоби "підказка перед будь-яким видаленням". Це означає, що ви отримаєте шанс сказати "ой! Це не те, що я хочу", перш ніж rm із задоволенням видалить усі ваші файли.

У мої ранні систематичні дні я робив систему rm -rf /в системі під час реєстрації з повними привілеями (root). Результат отримав два дні відновлення системи з резервного копіювання. Тому я зараз працюю rm -ri.


6

Як щодо:

rm -rf "$(pwd -P)"/* 

27
jQuery настільки потужний.
Pawel

5
rm  -rf * 

Не робіть цього! Це небезпечно! Впевнено переконайтесь, що ви знаходитесь у ПРАВІЙ ДИРЕКТОРІ!


4

зробити що ви знаходитесь у правильному каталозі

rm -rf *

2
Це не видаляє файли чи підкаталоги, ім'я яких починається з періоду.

1
правда. в моєму тестуванні, ні rm -rf. tvanfosson має найкраще рішення IMO зі своїм "cd ..; rm -rf <dir-to-remove>"
digitaljoel

2

Мабуть, це найпростіше безпечне та загальне рішення:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf

1

Я вважаю, що ця відповідь є кращою:

/unix/12593/how-to-remove-all-the-files-in-a-directory

Якщо ваш каталог верхнього рівня викликається images, то запустіть rm -r images/*. При цьому використовується глобальний оператор оболонки *для запуску rm -rкожного файлу чи каталогу в межах зображень.

в основному ви піднімаєтеся на один рівень, а потім скажете видалити все, що знаходиться в X каталозі. Таким чином, ви все ще вказуєте, яку папку має видалити вміст, що безпечніше, ніж просто сказати "видалити все тут", зберігаючи початкову папку (що іноді ви хочете, тому що вам заборонено або просто не хочете щоб змінити наявні дозволи папки)

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