Как удалить только содержимое каталогов?


14

Я в папке /var/myfolder.

Внутри есть несколько других папок, таких как: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/и т. Д.

Внутри каждого есть несколько файлов со случайными именами. Как удалить все файлы из всех папок внутри /var/myfolder?

Структура (все каталоги, например, A, B, C и т. Д. Внутри /var/myfolder) должна оставаться неизменной.

Ответы:


17

Пытаться:

find /var/myfolder -type f -delete

Это получает все обычные файлы в / var / myfolder и удаляет их, оставляя только каталоги.


Спасибо за решение. Я должен был упомянуть, что я делаю это в Solaris 9, так что в моем поиске нет опции -delete, но это хорошая отправная точка.
IroeN

2
Мне удалось найти следующее решение: find / var / myfolder -type f -exec rm -f {} \;
IroeN

2
Сожалею. Я использую Debian или Ubuntu. Насколько я знаю, ваше решение эквивалентно.
StarNamer

6
-type f! =! -type d
mikeserv

7

В zsh используйте . спецификатор glob для сопоставления только обычных файлов:

rm -- **/*(.)

Это рекурсивно удаляет все (не скрытые) обычные файлы в текущем каталоге и его подкаталогах. Добавьте Dспецификатор glob для удаления скрытых обычных файлов (и обычных файлов в скрытых каталогах).


Я использую Bash.
IroeN

1
@ user6554: ... которые не указывают ни ваш вопрос, ни использованные теги;)
0xC0000022L


3
find . -depth -exec rm {} + 2>/dev/null

rm не удаляет каталоги - просто запустите его на всем.

Чтобы сохранить символические ссылки на каталоги:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

И я думаю, что это также должно работать, возможно, слегка оптимизированным способом, если в вышеуказанной версии есть много файлов, которые могут нуждаться в тестировании:

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +

Обратите внимание, что GNU findимеет -xtypeопцию для этого.
Стефан Шазелас

@ StéphaneChazelas - аст тоже. но я не нуждался в глубине вообще, я не думаю. я держал его в топе, чтобы избежать множества ошибок - молчать или нет - но в остальных это было просто глупо.
mikeserv

1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print

0
rm var/myfolder/*/*

Будет удалено все содержимое вложенных папок, не затрагивая сами вложенные папки.

Первым *для подкаталогов myfolderсебя ( A, B, ...). Второй *для файлов в A, Bи т.д.

Если есть несколько папок внутри A, Bи т.д. Первый запуск: rm /var/myfolder/*/*/*затем запустить rm /var/myfolder/*/*.


0

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

find . -type f -print0 | xargs -0 rm -rf

и это должно удалить все файлы, оставляя дерево каталогов нетронутым. Опции -print0 и -0 могут быть опущены, если вы уверены, что у вас нет имен файлов или каталогов, содержащих пробелы.

Команда find различает файлы (-type f) и ссылки (-type l), так что это должно оставить ссылки без изменений, если таковые имеются. Не проверено, хотя. Если сомневаетесь, запустите:

находить . тип l

и посмотрите, появится ли что-нибудь прежде, чем вы запустите предыдущую команду find


Можете ли вы объяснить, как rmфлаг -r, -R, --recursive - remove directories and their contents recursivelyвписывается в это?
Стивен Раух

Поскольку мы не запускаем rm -rf, мы запускаем find. -тип f, а затем передать вывод этого rm -rf. Таким образом, он только удаляет файлы, но не затрагивает каталоги. Это то, что | Бит xargs делает, он принимает вывод команды слева и отправляет ее команде справа.
rjh427

Моя точка зрения точно. Если вы не передаете никаких каталогов, какой смысл использовать флаг, который работает только с каталогами?
Стивен Раух

Потому что мышечная память и до сих пор работает. Вы можете выдвинуть то же возражение в отношении опции -f «force», я бы ответил тем же.
rjh427

-2

Просто используйте команду ниже:

sudo rm -rf directory_in_which_you_have_content / *

---------------- ИЛИ --------------------------------- -----------------------

«*» Обозначает все, поэтому, когда вы будете использовать *, удалит весь контент. Так что либо используйте команду, подобную этой, либо перейдите в каталог, в котором вы хотите удалить весь контент, и просто используйте следующую команду:

sudo rm -rf *

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.