Як видалити всі файли та підкаталоги в каталозі БЕЗ видалення каталогу в bash?


53

Чи є команда видалити всі файли та підкаталоги в каталозі БЕЗ видалення каталогу?

Наприклад, якщо у мене є каталог "dontDeleteMe" з підкаталогами "1", "2", "3", і кожен підкаталог має в ньому кілька зображень, як я можу видалити підкаталоги "1", "2" і "3" і всі файли в них, не видаляючи батьківський каталог "dontDeleteMe"?

Відповіді:


66

Щоб видалити все в каталозі, не виймаючи каталог, введіть:

rm -rfv dontDeleteMe/*

Зверніть увагу, /*деталь дуже важлива. Якщо ви поставите пробіл перед *, воно видалить усі ваші файли у вашому поточному каталозі.

Крім того , будьте дуже обережні , граючи з rm, -rі *все в одній команді. Вони можуть бути згубним поєднанням.

Оновлення: Гаразд, я зрозумів, що у вас є приховані / крапкові файли [назви файлів з крапками на початку, колишні .hidden], тоді це залишить ці файли недоторканими.

Тож справді, найпростіше рішення оригінального питання : rm -rfv dontDeleteMe && mkdir dontDeleteMe

Ще один буде використовувати find«s -execваріант або трубу xargs(нижче):

find dontDeleteMe/* -print0 | xargs -0 rm -rv


Чи можете ви навести приклад використання xargs? Що таке xargs?
justingrif

@justingrif: find dontDeleteMe/* -print0 | xargs -0 rm -rv Я вважаю, що в більшості випадків це спрацює, незалежно від простору, а що ні. Але CD /tmp/і зробити тестовий каталог і спробувати його. :)
Мт

Ой, і з manpage: "xargs - будуйте та виконайте командні рядки зі стандартного введення"
Мт

5
Повторне створення каталогу не дорівнює видаленню його вмісту. наприклад, різниці дозволів каталогу umask, відмінності власників тощо ... відповідь enzotib вирішить проблеми з вашим оригінальним синтаксисом

3
Це не гарна відповідь. Використання * небезпечно і не працюватиме на точкових файлах без "dotglob" (див. Нижче). rm -rf dontDeleteMe && mkdir dontDeleteMeне гарантує, що dir буде створено заново з тими ж дозволами / власниками. Замість цього скористайтеся одним із find dontDeleteMe/ -mindepth 1 -deleteваріантів нижче.
Нільс Тодтманн

27

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

З цією метою bashнадайте можливість *узгодити все, навіть приховані об'єкти:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

dotglobЯкщо ви продовжуєте використовувати оболонку, де виконувались вищезазначені команди, може бути корисним відновити його стан за замовчуванням (unset):

shopt -u dotglob 

Він також не може працювати, коли у вас є велика кількість файлів
S ..

23

Відкрити мурашиний термінал ( Ctrl+ Alt+ T):

find somedir -mindepth 1 -delete

Це відповідатиме всім файлам і каталогім всередині somedirта дітям (онукам), включаючи "приховані" точкові файли, але виключаючи somedirсебе через те -mindepth 1, то -deleteвони.


Ласкаво просимо до AskUbuntu! Хоча ваша відповідь потенційно може допомогти оригінальному плакату, відсутність інформації, яка б пояснила, що це зробить, щоб допомогти йому / їй зробить вашу відповідь неповною.
Oyibo

3
Не вистачає пояснень, але все ж найкраща відповідь. Також працює в OSX (звичайно, крім способу відкриття терміналу).
noamtm

6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Використовуйте xdevопцію для видалення файлів лише в межах пристрою.


GNU знайти є -delete. Це передбачає -depthі простіше запам'ятати, ніж-depth -exec rm -Rf {} \;
Нілс Тодтманн

4

Для видалення (у терміналі) всіх файлів і підкаталогів, крім базової директорії під назвою "dontdelete":

rm -rf dontdelete/*

Це не видаляє приховані файли, тому "всі файли" можуть бути занадто жирним твердженням.
Стефан ван ден Аккер

4

Ви можете використовувати findз -deleteпрапором:

find dontDeleteMe/* -delete

Це /*важливо, оскільки він говорить findлише про те, щоб шукати ВНІШЕ папку під назвою "dontDeleteMe".

Також переконайтеся, що -deleteпрапор знаходиться в кінці findкоманди.


1
Це рішення не видаляє жодних прихованих файлів, якщо ви не включите dotglob. В іншому випадку використання параметра -mindepth 1прапора здається єдиним способом змусити його працювати.
Стефан ван ден Аккер

3
rm -rf  directory/{.*,/*}

Що говорить:

Видаліть усі файли, починаючи з. в "каталозі" і всі інші файли теж.

Хоча, як ласкаво зазначив Neftas, це рішення не є безпечним!

Більш безпечне рішення:

 rm -rf directory/!(.|..)

Ця команда може бути небезпечною, оскільки ви також включаєте .і ..каталоги. Цього можна уникнути, змінивши {.*}на {.??*}, але тоді ви не будете видаляти приховані файли лише з одним символом, наприклад .a.
Стефан ван ден Аккер

що з цього приводу? rm -rf каталог /! (. | ..)
Тебе,

Це виглядає як набагато краще рішення, ніж те, що я придумав. Можна запропонувати вам відредагувати свою відповідь?
Стефан ван ден Аккер

пропозиція прийнята)
Тебе

1

Я не впевнений, чому це так складно, допоможіть мені, якщо я помиляюся

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

Це воно


У цьому є невеликий недолік спроби видалити і поточний каталог, що, звичайно, не працює, оскільки він все ще використовується як робочий каталог оболонки, що викликає.
Девід Фоерстер

1

Є ще простіша відповідь:

  1. cd dontDeleteMe

  2. rm -rf *

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

Я цього не можу сказати достатньо. Мені довелося відновити коробку, оскільки хтось не звертав уваги та набирав текст під rm -rf *час входу.

* nix припускає, що якщо ви root або якщо ви використовуєте як root, то ви знаєте, що робите. Тому переконайтеся, що ви знаєте, що робите, перш ніж це зробити.

Альтернатива, яка гарантує, що ваша команда 'cd' працює перед тим, як видавати 'rm', використовувати

cd dontDeleteMe && rm -rf *

6
Це небезпечна пропозиція. Що ви хочете, це: cd dontDeleteMe && rm -rf *
Ізката

@Izkata Або переконайтесь, що перед тим, як видавати команду rm, переконайтеся, що операція cd пройшла успішно.
Елія Каган

1
@EliahKagan Саме так працює мій фрагмент коду ...
Ізката

Насправді це не більше і не менш небезпечно, ніж те, що ви пропонуєте. Все && полягає в тому, щоб з'єднати дві команди разом, щоб вони виконувались одночасно. Якщо що-небудь мій метод насправді БЕЗПЕЧНІший, оскільки вам доведеться зупинитись і .look перед виконанням rm -rf *. Призупинення подвійної перевірки завжди краще.
користувач30619

5
@ user30619 &&Оператор не просто зв'язує команди разом; вона вимагає, щоб кожна команда була успішною до того, як буде виконана наступна команда. Якщо cdкоманда не працює з будь-якої причини (каталог не існує, привілеї тощо), rmкоманда не буде виконана. Я б назвав це більш безпечним.
ean5533

0
  1. Найпростіша річ для мене - експерт з Windows, але новачок ubuntu
  2. Клацніть піктограму Файли на панелі запуску
  3. Перейдіть до каталогу, де знаходяться файли та папки, які потрібно видалити
  4. Клацніть правою кнопкою миші в порожній частині вікна поруч із файлами та натисніть "Відкрити в терміналі" - залиште вікно "Файли відкритим"
  5. Відкриється вікно терміналу і буде "встановлено" на папку, яку ви знаходите
  6. Ви можете ввести "dir" (ігнорувати котирування, коли я говорю тип) і натиснути клавішу Enter для терміналу, щоб показати список файлів і папок - просто щоб довести, що ви "в" потрібній папці
  7. введіть "rm -rf *" і натисніть клавішу Enter
  8. залежно від розміру папок / файлів для видалення система призупинить
  9. Коли термінальний рядок повернеться, відкрите вікно файлів тепер скаже «Папка порожня»
  10. Я мав успіх у цьому методі, і це дозволило мені бачити файли / папки як у вікні Файли, так і в результаті команди Dir у вікні терміналу
  11. Мене також потішило, що у вікні Файли ця папка тепер порожня - тим більше, що я переслідував ці файли, шукаючи папку сміття, у якій вони знаходились
  12. Дякую всім, хто подав відповіді - це було дуже інформативно

Це здається доволі заплутаним - тим більше, що ти все rm -rf *одно закінчиш працювати .
Девід Фоерстер

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