Удалите все файлы, но сохраните все каталоги в 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 '{}' +