Як видалити лише файли, але зберегти структуру каталогу?


16

Я хотів би видалити кожен файл, але зберігайте структуру папок. Чи є спосіб?

ПРИМІТКА: (Я використовую GNU bash 4.1.5).


1
Як саме ви маєте на увазі "виключити"? Ви використовуєте якусь команду? Якщо так, будь ласка, оновіть своє питання, щоб включити це.
slm


Я думаю, ти маєш на увазі видалити кожен файл.
slm

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

Ні, ви цього не зробили :-) Або, якщо ви це зробили, ви видалили його знову
Мавг каже, що поверніть Моніку

Відповіді:


18

Спробуйте це:

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

Це видалить кожен окремий файл, крім каталогів, під поточним робочим каталогом. Будьте надзвичайно обережні з цією командою.

Якщо версія findна вашому апараті підтримує його, ви також можете використовувати

find . ! -type d -delete

@slm: Я не впевнений, наскільки це портативно. Я додав це як вторинний варіант. Я щойно зрозумів, що моя редакція зробила мою відповідь практично ідентичною вашій. Вибач за це; це був не мій намір.

Чи захищений "{}" від пробілів у файлах? Я бачу, як ти весь час використовуєш, і я не думаю, що коли-небудь бачив, як це використовували, перш ніж я бачив, як ти публікуєш рішення з ним.
slm

На сторінці GNU знайдіть сторінку: "Зауважте, що дужки укладені в єдині лапки, щоб захистити їх від інтерпретації як пунктуації сценарію оболонки". Я не впевнений, коли це потрібно. Я в основному це роблю за звичкою. findКоманда ніколи не бачить лапки. Він просто розглядає {}маркер як аргумент.

Я бачу це на прикладі, але шаблони показують це, " -exec command {} +" і це " -exec command ;". У \;минулому я ніколи не використовував "{}".
slm

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

7

Ви можете використовувати команду findдля пошуку кожного файлу, але підтримувати структуру каталогу:

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

Згідно з цим питанням Unix & Linux Q&A під назвою: gnu find and masking the {} для деяких оболонок - що? , втеча від {}одинарних кліщів ( '), здається, більше не потрібна для сучасних снарядів, таких як 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 -тип f -exec rm {} \;

Syntex: знайти (шлях файлу) -mtime (більше або менше днів) -тип f -exec rm {} \;

-type: згадайте тип файлу "f" для каталогу "d" -exec: виконайте команду rm: delete {}: вихід команди пошуку

Примітка: перед тим, як користуватися, протестуйте його. Будь ласка, не соромтесь виправити або оновити, якщо я щось пропустив.


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