Як видалити всі файли з каталогу?


289

Найближчий до мене - це

# rm /path/to/directory/*.*

але це не працює для файлів, які не мають розширення ...

Відповіді:


340

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

Щоб видалити все в каталозі, використовуйте:

rm /path/to/directory/*

Можна скористатися -rопцією, наприклад:

rm -r /path/to/directory/*

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


13
Якщо ви також хочете видалити приховані файли, запущені shopt -s dotglobдо запускуrm (...)
danjjl

7
* Означає all files;) *.*означає всі файли, що містять .десь ім’я
Rinzwind

10
@Rinzwind, точніше, зірочка означає "нуль або більше будь-якого символу". Отже, *a*означає нуль або більше символів, за якими aслідує нуль або більше символів. Це буде відповідати імена файлів happy, apple, aабо la.
НезадоволенняGoat

7
@ user784637 Ви занадто легко
справляєте

1
Ось потрібна вам команда: rm - *
anon58192932

168
  • Щоб видалити папку з усім її вмістом ( включаючи всі внутрішні папки ):

    rm -rf /path/to/directory
    
  • Щоб видалити весь вміст папки ( включаючи всі внутрішні папки ), але не саму папку:

    rm -rf /path/to/directory/*
    

    або

    rm -rf /path/to/directory/{*,.*}
    

    якщо ви хочете переконатися, що приховані файли / каталоги також видаляються.

  • Щоб видалити всі "файли" з папки ( не видаляючи внутрішні папки ):

    rm -f /path/to/directory/{*,.*}
    


  • Попередження : якщо у вас є пробіли, обов'язково використовуйте лапки.

    rm -rf /path/to the/directory/*
    

    еквівалентно 2 окремим rm -rfдзвінкам:

    rm -rf /path/to
    rm -rf the/directory/*
    

    Щоб уникнути цієї проблеми, ви можете використовувати 'одноцитати '( не розширює змінні оболонки) або "подвійні лапки "( розширює змінні оболонки):

    rm -rf "/path/to the/directory/"*
    


Де:

  • rm- означає " видалити "
  • -f- означає " сила ", яка корисна, коли ви не хочете, щоб вас запитували / запитували, якщо ви хочете видалити архів, наприклад.
  • -r- означає " рекурсивний ", що означає, що ви хочете рекурсивно переходити до кожної папки та видаляти все.

8
Я вважав, що це є більш вичерпною та корисною відповіддю, що відповідає і вище, що було позначено як Прийняте.
надихнула

2
rm -rf /path/to/directory/*не видаляє прихований файл у папці, наприклад .htaccess. Можливо rm -rf /path/to/directory/.? Не пробував.
Марк Беррі

@MarkBerry rm -rf /path/to/directory/.*
Ліліан А. Морару

@ LilianA.Moraru, я сьогодні зробив кілька тестувань. rm -rf /path/to/directory/.*видаляє лише приховані файли (файли) у вказаному каталозі. Переглядаючи коментар @ danjjl на відповідь @ Rinzwind, щоб також видалити приховані файли, запустіть shopt -s dotglobперед запуском rm -rf /path/to/directory/*.
Марк Беррі

ПОПЕРЕДЖЕННЯ: rm -rf /path/to/directory/.*у моїй системі викликано видалення елементів у /path/to. На щастя, я просто створив резервну копію всіх своїх даних на окремому диску. Потрібно сказати, що НЕ видайте команду, rm -rf /path/to/directory/.*якщо ви не створили резервну копію всього комп’ютера в окремому / безпечному місці!
законник

43

Щоб видалити всі файли в каталозі (включаючи приховані файли та підкаталоги), запустіть:

rm -rf /path/to/directory/{*,.*}

1
Це має бути прекрасна прийнята відповідь. Дякую!
Нам Г ВУ

3
Не відповідає цей глобус "." і ".." теж?
hertzsprung

4
@hertzsprung - це робить, і це дасть вам попередження , що він не може видалити , ./і ../, але він все одно буде видалити приховані файли.
Райан Уіл

Це не працює на консолі Mac, приховані файли все ще є з цим командним рядком.
агапітокандемор

Щоб видалити все з поточного каталогу:rm -r $(pwd)/{*,.*}
Джиммі Адаро

10

Якщо ви хочете видалити лише файли в / шлях / до / каталогу, ви можете це зробити

find /path/to/directory -type f -print0| xargs -0 rm 

або

find /path/to/directory -type f -exec rm '{}' \;

Ви можете виконувати навантаження за допомогою find, перевага полягає в тому, що ви можете перелічити те, що знайдено, не перекладаючи його, щоб rmви могли побачити, що буде видалено перед початком роботи.


2
GNU findяк -deleteприсудок. Якщо ви все ще хочете користуватися -exec, заміни \;на +збиратимуть rmдзвінки разом, підвищуючи ефективність.
enzotib

1
велика кількість файлів з '+' спричинить проблеми, оскільки список буде занадто великим, як rm -f *. і при видаленні великої кількості файлів із однієї папки (розмовляючи в мільйонах) обидва вони непогані :) Зрештою, C ++ прийшов і видалив файли в порядку inode в dir-tree.
Osis

3
Ви дійсно повинні додати a - після rm. Без цього, якщо у вас є імена файлів -rf або подібні, буде інтерпретуватися як аргумент до rm. наприклад, xargs -0 rm - або -exec rm - {} \;
Річм

Ви також можете надати аргумент -n для xargs. Це призведе до розбиття команд rm на максимальну кількість аргументів, тобто 'xargs -n 100 -0 rm -' видалить файли в шматки 100.
Richm

1
Ви також можете додати -maxdepth 1, щоб переконатися, що пошук не повертає файли з жодного підкаталогу. тобто знайти / шлях / до / каталогу -maxdepth 1 -тип f
Richm

7

Щоб видалити всі файли та каталоги (включаючи приховані ) в каталозі, ви можете спробувати наступне:

  • видаліть папку, а потім відтворіть її

    rm -rf dir_name && mkdir dir_name
    
  • використання find

    find dir_name -mindepth 1 -delete  
    

Тут ми вказуємо -mindepth 1виключити саму директорію dir_name.
Подивіться за наступним посиланням:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory


Дякую за пораду, і я додав більше пояснень для посилань.
zeekvfu

3
Будьте уважні, оскільки видалення та повторне створення папки може призвести до різних / неправильних дозволів для цієї папки!
einjohn

6

Якщо ви також хочете видалити всі підкаталоги та сам каталог, можете скористатися rm -rf /path/to/directory. Але завжди двічі перевіряйте лінію перед натисканням клавіші return, також rm -rfможе виникнути велика кількість загроз, наприклад, якщо ви випадково вставили пробіл після першого косого кута, маючи права доступу суперпользователя ...


1

Оскільки це питання постійно перебуває на вершині Google, коли я сам це шукаю:

Інші відповіді страждають від різних проблем:

  1. Деякі з них включають, .і ..це шумно, заплутано і дратує.

  2. Деякі з них забувають приховані файли (файли, що починаються з крапки).

  3. Вони не видаляють у правильному (найглибшому першому) порядку, щоб дозволити видалення каталогу.

  4. Вони спускаються в інші (змонтовані) файлові системи, що часто небажано.

  5. Їх важко правильно розширити за допомогою додаткових параметрів (докладніше про це нижче).

Отже, щоб ЗАБЕЗПЕЧНО видалити всі файли та папки в каталозі, зробіть це:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

Зауважте, що я додав -xdevаргумент, щоб запобігти спуску в кріплення (наприклад, /procтощо).

Чому ні -depthчи -delete?

Незважаючи на те, що люди постійно намагаються до цього звертатися, ці методи мають і зворотний бік: це не здається, що вони досить розширюються, щоб дозволити -pruneвикористовувати підкаталог (не вносячи більше проблем). На відміну від цього методу, ви можете вставити

-not \( -path "${DIR}/subdir" -prune \)

перед -mindepthаргументом для виключення subdirвидалення його вмісту.


А для першого поглиблення для цього є -depthпрапор find.
Сергій Колодяжний

Е - е ... чому б не використати -deleteзfind ? -deleteє глибиною першою. Ви вже припускаєте, що не POSIX findз -printf, тому ви можете так само добре використовувати -deleteабо-depth -print0 | xargs -0 rm
muru

@muru: Тому що я не знав кращого ... я його зміню.
Мехрдад

@muru: Насправді, здається, ваш метод не працює з -not \( -path "$DIR/subdir" \)... але мій? Чому?
Мехрдад

@Mehrdad, що це робити?
муру

0

Ви можете cdзайти в каталог, а потім виконати команду так rm *.*само, як і в DOS, якщо ви пам'ятаєте.


1
DOS - DEL для файлів, а RMDIR - для випорожнених каталогів, а також прихованих та системних файлів повинні спочатку видалити ці атрибути ATTRIB. Не так просто;)
Ерік

0

Щоб видалити поточний каталог, ви можете, наприклад, використовувати rm -d ./*

-d повідомляє також видаляти каталоги.

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