Удалите все файлы, но сохраните все каталоги в bash script?

Я пытаюсь сделать что-то, что, вероятно, очень просто, у меня есть структура каталогов, такая как:

dir/
    subdir1/
    subdir2/
        file1
        file2
        subsubdir1/
            file3

Я хотел бы запустить команду в bash script, которая будет рекурсивно удалять все файлы из каталога dir, но оставить все каталоги. То есть:

dir/
    subdir1/
    subdir2/
        subsubdir1

Что было бы подходящей для этого командой?

Ответ 1

find dir -type f -print0 | xargs -0 rm

find перечисляет все файлы, которые соответствуют определенному выражению в заданной директории, рекурсивно. -type f соответствует обычным файлам. -print0 предназначен для печати имен с использованием \0 в качестве разделителя (поскольку любой другой символ, включая \n, может иметь имя пути). xargs предназначен для сбора имен файлов со стандартного ввода и помещения их в качестве параметров. -0 должен убедиться, что xargs будет понимать разделитель \0.

xargs достаточно разумен, чтобы вызвать rm несколько раз, если список параметров станет слишком большим. Так что это намного лучше, чем пытаться вызвать sth. как rm $((find ...). Также он намного быстрее, чем вызов rm для каждого файла сам по себе, например find ... -exec rm \{\}.

Ответ 2

С помощью GNU find вы можете использовать действие -delete:

find dir -type f -delete

Со стандартным find вы можете использовать -exec rm:

find dir -type f -exec rm {} +

Ответ 3

find dir -type f -exec rm {} \;

где dir - это верхний уровень того, где вы хотите удалить файлы из

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

find dir -not -type d -exec rm {} \;

Ответ 4

find dir -type f -exec rm '{}' +