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


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

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

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


199
2017-09-06 07:58


Источник




Ответы:


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

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

rm /path/to/directory/*

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


227
2017-09-06 08:06



Если вы также хотите удалить скрытые файлы, выполните shopt -s dotglob перед запуском rm (...) - danjjl
Значение all files ;) *.* означает все файлы, содержащие . где-то в названии - Rinzwind
@Rinzwind, точнее, звездочка означает «ноль или более любого персонажа». Так *a* означает ноль или более символов, за которым следует a за которыми следуют ноль или более символов. Он будет соответствовать именам файлов happy, apple, a или la, - DisgruntledGoat
@ user784637 вы слишком легко впечатлены - barlop
Вот вам команда: rm - * - anon58192932


  • Удалять Папка со всем его содержимым (включая все внутренние папки):

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

    rm -rf /path/to/directory/*
    
  • Чтобы удалить все «файлы» изнутри папки (не удаление внутренних папок):

    rm -f /path/to/directory/*
    

Где:

  • rm - означает "Удалить"
  • -f - означает "сила», что полезно, если вы не хотите, чтобы вас спросили / предложили, если вы хотите удалить архив, например.
  • -r - означает "рекурсивный«это означает, что вы хотите перейти рекурсивно вниз по каждой папке и удалить все.

119
2017-09-07 17:26



Я нашел, что это более полный и полезный ответ, помимо ответа, который был отмечен как «Принято». - inspirednz
rm -rf /path/to/directory/* не удаляет скрытый файл в папке, например. .htaccess, Может быть rm -rf /path/to/directory/.? Не пробовал. - Mark Berry
@MarkBerry rm -rf /path/to/directory/.* - Lilian A. Moraru
@ LilianA.Moraru, я провел некоторое тестирование сегодня. rm -rf /path/to/directory/.* удаляет только скрытый файл (ы) в указанном каталоге. Глядя на комментарий @ danjjl на ответ @ Rinzwind, чтобы также удалить скрытые файлы, запустите shopt -s dotglob перед запуском rm -rf /path/to/directory/*, - Mark Berry


Чтобы удалить все файлы в каталоге (включая скрытые файлы и подкаталоги), выполните:

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

29
2017-11-23 09:38



Это должен быть прекрасный принятый ответ. Спасибо! - Nam G VU
Не соответствует ли этот глобус "." и тоже? - hertzsprung
@hertzsprung - он делает, и он даст вам предупреждение о том, что он не может удалить ./ а также ../, но он все равно удалит скрытые файлы. - Ryan Wheale


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

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

или

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

Вы можете делать нагрузки с помощью find, преимущество состоит в том, что вы можете перечислить то, что найдено, rm поэтому вы можете увидеть, что будет удалено до начала.


7
2017-09-06 12:13



GNU find как -delete сказуемое. Если вы все еще хотите использовать -exec, заменяя \; с + соберется rm звонит вместе, повышая эффективность. - enzotib
большое количество файлов с «+» вызовет проблемы, так как список будет слишком большим, так же как rm -f *. и при удалении большого количества файлов из одной и той же папки (говорящей в миллионе) оба они не хороши :) В конце C ++ пришла и удалила файлы в порядке inodes в dir-tree. - Osis
Вы действительно должны добавить a - после rm. Без этого, если у вас есть имена файлов -rf или подобные, они будут интерпретироваться как аргументы для rm. например xargs -0 rm - или -exec rm - {} \; - Richm
вы также можете указать аргумент -n для xargs. Это заставит его разделить команды rm на максимальное количество аргументов, то есть «xargs -n 100 -0 rm -» удалит файлы в кусках 100. - Richm
Вы также можете добавить -maxdepth 1, чтобы гарантировать, что find не возвращает файлы из любых подкаталогов. то есть find / path / to / directory -maxdepth 1-type f - Richm


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


6
2017-09-07 08:51





Чтобы удалить все файлы и каталоги (включая скрытый ) в каталоге, вы можете попробовать следующее:

  • удалить папку, а затем воссоздать ее

    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


5
2017-11-27 16:05



Спасибо за ваш совет, и я добавил дополнительные пояснения к ссылкам. - zeekvfu
Будьте осторожны, так как удаление и повторное создание папки могут привести к разным / неправильным разрешениям для этой папки! - einjohn


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


1
2018-05-01 00:59



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


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

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


0
2017-08-29 07:17





Поскольку этот вопрос постоянно находится на вершине 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 аргумент, чтобы предотвратить спуск в mounts (например, /proc и т.д.).

Почему нет -depth или -delete?

Несмотря на то, что люди постоянно меня заворачивают, эти методы имеют недостаток: похоже, что они достаточно расширяемы, чтобы позволить -pruneв подкаталоге (без дополнительных проблем). В отличие от этого метода, вы можете вставить

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

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


-1
2018-05-21 00:54



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