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

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

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

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

296
задан 22 November 2014 в 23:48

9 ответов

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

  • Удалить все нескрытые файлы* в использовании каталога:

    rm /path/to/directory/*
    

    Однако это покажет ошибку для каждого подкаталога, потому что в этом режиме только позволяется удалить файлы.

  • Удалить все нескрытые файлы и подкаталоги (наряду со всем их содержанием) в использовании каталога:

    rm -r /path/to/directory/*
    

* Скрытые файлы и каталоги - те, имена которых запускаются с . (точечный) символ, например: .hidden-file или .hidden-directory/. Обратите внимание что, в Bash, если dotglob опция (который является прочь по умолчанию) установлена, rm будет действовать на скрытые файлы также, потому что они будут включены когда * расширен оболочкой для обеспечения списка аргументов имени файла.

347
ответ дан 22 November 2019 в 22:39
  • Удалить папку со всем ее содержанием (включая все внутренние папки):

    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 - обозначает "рекурсивный", что означает, что Вы хотите пойти рекурсивно вниз каждая папка и удалить все.
170
ответ дан 22 November 2019 в 22:39

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

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

или

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

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

11
ответ дан 22 November 2019 в 22:39

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

6
ответ дан 22 November 2019 в 22:39

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

0
ответ дан 22 November 2019 в 22:39

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

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

    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

7
ответ дан 22 November 2019 в 22:39

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

rm -rf /path/to/directory/{*,.*}
44
ответ дан 22 November 2019 в 22:39

Для удаления текущего каталога Вы могли, например, использовать rm -d ./*

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

0
ответ дан 22 November 2019 в 22:39

Так как этот вопрос постоянно наверху 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?

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

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

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

1
ответ дан 22 November 2019 в 22:39

Другие вопросы по тегам:

Похожие вопросы: