Что команда должна удалить все файлы, но не каталоги?

Скажем, у меня есть дерево каталогов как это:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Если я использовал rm -r FOLDER/*, все в ПАПКЕ было бы удалено включая подкаталоги. Как я могу удалить все файлы в ПАПКЕ и в ее подкаталогах, не удаляя фактические каталоги?

23
задан 1 July 2019 в 17:08

3 ответа

То, что Вы пытаетесь сделать, является рекурсивным удалением. Для этого Вам нужен рекурсивный инструмент, такой как find.

find FOLDER -type f -delete
37
ответ дан 23 November 2019 в 01:22

С bash:

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

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

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

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

Наконец, сброс globstar:

shopt -u globstar
<час>

С zsh, усиливая спецификатор шарика:

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

(.) спецификатор шарика, который ограничивает расширения шарика на просто регулярные файлы.

Вышеупомянутое просто распечатает имена файлов для фактического удаления:

rm -- FOLDER/**/*(.)
13
ответ дан 23 November 2019 в 01:22

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

find . ! -type d -exec rm '{}' \;
11
ответ дан 23 November 2019 в 01:22

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

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