Как удалить все файлы из каталога?

289

Самое близкое, что я получил, это

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

но это не работает для файлов, которые не имеют расширения ...

user784637
источник

Ответы:

340

Linux не использует расширения. Создатель файла должен решить, хочет ли он, чтобы имя имело расширение. Linux смотрит на 1-й байт, чтобы выяснить, с каким файлом он имеет дело.

Чтобы удалить все в каталоге, используйте:

rm /path/to/directory/*

Вы можете использовать -rопцию, например:

rm -r /path/to/directory/*

также удалить любые подкаталоги (вместе со всем их содержимым) внутри каталога, содержимое которого вы удаляете. В противном случае будет отображена ошибка, сообщающая, что каталог не удаляется.

Rinzwind
источник
13
Если вы также хотите удалить скрытые файлы, запустите shopt -s dotglobперед запускомrm (...)
danjjl
7
* Означает all files;) *.*означает все файлы, содержащие .где-то в названии
Rinzwind
10
@Rinzwind, точнее, звездочка означает «ноль или более любого символа». Так *a*означает ноль или более символов, за которыми aследует ноль или более символов. Это будет соответствовать имена файлов happy, apple, aили la.
Рассерженная шлюха
7
@ user784637 ты слишком впечатлен
barlop
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
Я обнаружил, что это более полный и полезный ответ, помимо ответа, помеченного как Принятый.
inspirednz
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
Это должен быть красивый принятый ответ. Спасибо!
Нам G VU
3
Разве этот шарик не соответствует "." и тоже?
hertzsprung
4
@hertzsprung - это делает, и это даст вам предупреждение , что он не может удалить , ./и ../, но он все равно будет удалить скрытые файлы.
Райан Уил
Это не работает на консоли Mac, скрытые файлы все еще там с этой командной строкой.
Агапитокандемор
Для удаления всего текущего каталога:rm -r $(pwd)/{*,.*}
Джимми Адаро
10

Если вы хотите удалить только файлы в каталоге / path / to /, вы можете сделать

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вызовы вместе, повышая эффективность.
энзотиб
1
большое количество файлов с '+' вызовет проблемы, так как список будет слишком большим, как и rm -f *. и при удалении большого количества файлов из одной и той же папки (говоря в миллионах) они оба не годятся :) В конце концов, C ++ пришел и удалил файлы в порядке inode в dir-tree.
Осис
3
Вы действительно должны добавить - после рм. Без этого, если у вас есть имена файлов -rf или аналогичные, они будут интерпретироваться как аргументы для rm. например, xargs -0 rm - или -exec rm - {} \;
Ричм
Вы также можете предоставить аргумент -n для xargs. Это приведет к тому, что команды rm будут разделены на максимальное количество аргументов, т.е. xargs -n 100 -0 rm - удалит файлы по 100
штук.
1
Вы также можете добавить -maxdepth 1, чтобы гарантировать, что find не возвращает файлы из каких-либо подкаталогов. т.е. найти / путь / к / каталогу -maxdepth 1 -типа f
Ричм
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
источник
Спасибо за ваш совет, и я добавил больше объяснений для ссылок.
zeekvfu
3
Будьте осторожны, так как удаление и повторное создание папки может привести к другим / неправильным разрешениям для этой папки!
Эйнджон
6

Если вы также хотите удалить все подкаталоги и сам каталог, вы можете использовать rm -rf /path/to/directory. Но всегда дважды проверяйте свою строку перед нажатием возврата, это также 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из его содержимого.

Mehrdad
источник
И для первого порядка глубины есть -depthфлаг findдля этого.
Сергей Колодяжный
Э-э ... почему бы просто не использовать -deleteсfind ? -deleteв глубину Вы уже принимаете не POSIX findс -printf, так что вы также можете использовать -deleteили-depth -print0 | xargs -0 rm
Muru
@ Муру: Потому что я не знал лучше ... Я изменю это.
Мердад
@ Муру: На самом деле, кажется, ваш метод не работает -not \( -path "$DIR/subdir" \)... а мой работает? Почему?
Мердад
@ Mehrdad что это должно делать?
Муру
0

Вы можете cdвойти в каталог и затем запустить команду, rm *.*как в DOS, если вы помните.

ВК Мавани
источник
1
DOS - это DEL для файлов и RMDIR для очищенных каталогов - и скрытые, и системные файлы должны сначала удалить эти атрибуты ATTRIB. Не так просто;)
Эрик
0

Чтобы удалить текущий каталог, вы можете, например, использовать rm -d ./*

-d указывает на удаление каталогов, а также.

arviman
источник