Як видалити лише вміст каталогів?


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глобальний класифікатор для видалення прихованих регулярних файлів (і звичайних файлів у прихованих каталогах).


Я використовую 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 - аст теж. але мені взагалі не знадобилось -depth, я не думаю. я тримав його у верхній частині, щоб уникнути стільки викликів помилок - замовкнути чи ні - але в інших це було просто нерозумно.
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 "сила", я б вам дав таку ж відповідь.
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.