Какова команда удаления всех файлов, но не каталогов?

[F1]
1
задан 19 December 2016 в 10:58

2 ответа

С bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Здесь выполняется итерация по glob расширенным именам файлов и удалению только файлов.

Вышеупомянутое выполняется в сухом режиме, если выполняется с изменениями (d3)

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Наконец, unset globstar:

shopt -u globstar

С zsh , используя квалификатор glob:

echo -- FOLDER/**/*(.)

(.) является квалификатором glob, который ограничивает разворот glob только обычными файлами.

Вышеуказанное будет просто печатать имена файлов, для фактических удаление:

rm -- FOLDER/**/*(.)
13
ответ дан 23 May 2018 в 04:03
  • 1
    +1 для zsh globbing. Больше людей должны знать об ужасных вещах, которые может сделать zsh. – marcelm 20 November 2016 в 17:06

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

find . ! -type d -exec rm '{}' \;
11
ответ дан 23 May 2018 в 04:03
  • 1
    -exec rm {} + будет быстрее, особенно если есть много файлов. – muru 20 November 2016 в 08:14
  • 2
    И find . ! -type d -exec rm {} + удаляет сим-ссылки. – DK Bose 20 November 2016 в 08:37
  • 3
    @muru: Если конкретная реализация find не поддерживает -delete, она, вероятно, также не поддерживает -exec ... {} +. Рекомендуемый способ справиться с этим - find ... -print0 | xargs -r0 rm (если ожидать много потенциальных совпадений). – David Foerster 20 November 2016 в 17:02
  • 4
    @DavidFoerster не очень. -exec ... {} + - POSIX, но -delete - нет. (Между прочим, и -print0.) – muru 20 November 2016 в 17:13
  • 5
    @muru: достаточно справедливо. Я столкнулся, по крайней мере, с двумя реализациями, отличными от POSIX find, которые поддерживали -print0, но не -exec ... {} + (хотя я не помню о -delete). Один был на OS X, другой на Solaris (несколько лет назад на очень консервативно обновленной системе). Вы также можете заменить -print0 на -printf '%p\0'. В любом случае, это Ask Ubuntu , а не Unix & Linux , а Ubuntu использует GNU find с навсегда. – David Foerster 20 November 2016 в 17:26

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

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