Как удалить только файлы, но сохранить структуру каталогов?


16

Я хотел бы удалить каждый файл, но сохранить структуру папок. Есть ли способ?

ПРИМЕЧАНИЕ: (я использую GNU bash 4.1.5).


1
Как именно вы имеете в виду «исключить»? Вы используете какую-то команду? Если это так, пожалуйста, обновите свой вопрос, чтобы включить это.
SLM


Я думаю, что вы имеете в виду удалить каждый файл.
SLM

1
@slm Я обновил с помощью команды, которую я обычно использую для исключения файлов.
Том Брито

Нет, у вас нет :-) Или, если вы сделали, вы удалили его снова
Mawg говорит восстановить Монику

Ответы:


17

Попробуй это:

find . ! -type d -exec rm '{}' \;

Это удалит каждый отдельный файл, кроме каталогов, ниже текущего рабочего каталога. Будьте предельно осторожны с этой командой.

Если версия findна вашем компьютере поддерживает это, вы также можете использовать

find . ! -type d -delete

@slm: я не уверен, насколько это портативно. Я добавил это в качестве вторичного варианта. Я только что понял, что мое редактирование сделало мой ответ практически идентичным вашему. Прости за это; это не было моим намерением.

'{}' Защищает от пробелов в файлах? Я вижу, как вы используете все время, и я не думаю, что когда-либо видел, как он использовался, до того, как увидел, что вы публикуете решения с ним.
SLM

Из GNU найдите страницу man: «Обратите внимание, что фигурные скобки заключены в одинарные кавычки, чтобы защитить их от интерпретации как пунктуации сценария оболочки». Я не уверен, когда это необходимо. Я в основном делаю это по привычке. Команда findникогда не видит кавычки. Он просто видит {}маркер в качестве аргумента.

Я вижу это на примере, но шаблоны показывают это " -exec command {} +" и это " -exec command ;". Я использовал \;в прошлом просто никогда не {'}.
SLM

@slm: шаблоны также не показывают экранирование точки с запятой, что обычно необходимо при использовании оболочки для выполнения find. Я думаю, что шаблоны предназначены для того, чтобы показать, какие аргументы findнужны команде, и не беспокоиться ни о чем, связанном с оболочкой.

7

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

$ find /some/dir -type f -exec rm {} +

В соответствии с вопросами и ответами Unix и Linux под названием: gnu находит и маскирует {} для некоторых оболочек - что? экранирование {}с одиночными галочками ( ') больше не требуется для современных оболочек типа Bash.


1

Простой способ рекурсивного удаления всех обычных файлов в текущем каталоге и подкаталогах:

zsh -c 'rm **/*(.)'

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

shopt -s globstar
rm **/*

Это не работает для команд, кроме как rm. В общем, вы можете использовать find:

find . -type f -delete

или если ваш findне поддерживает -delete:

find . -type f -exec rm {} +

-2

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

И я использовал следующий формат, который работал для меня.

find / test123 / home / test_file_hip / data / nfs -mtime +6 -type f -exec rm {} \;

Синтаксис: find (путь к файлу) -mtime (больше или меньше дней) -type f -exec rm {} \;

-type: указать тип файла "f" для каталога "d". -exec: выполнить команду rm: удалить {}: вывод команды find

Примечание. Проверьте его перед использованием. Пожалуйста, не стесняйтесь исправлять или обновлять, если я что-то пропустил.


1
поскольку это дополнительное требование, которое не было упомянуто ФП, и поскольку базовая find ... rmструктура уже была рассмотрена, я не уверен, что это ценный вклад в качестве нового ответа на этот вопрос.
Джефф Шаллер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.