Видаляйте всі файли рекурсивно, не видаляючи каталоги


10

Я хочу "очистити" всі файли з каталогу, включаючи всі файли в підкаталогах, але я хочу залишити підкаталоги на місці. Я розумію rm -r, що він також видалить самі підкаталоги.

Я не хочу видаляти приховані (крапкові) файли.

Як це можна зробити?


1
find -type f ! -name "[.]*" -deleteне підходить?
Костас

Не знаю. Це робить те, про що я прошу?
Скотт Вілтон

Спробуйте без цього -delete- він просто надрукує назви файлів для видалення.
Костас

Ви хочете видалити файли (приховані чи ні) у прихованих каталогах?
Стефан Шазелас

А як щодо посилань на каталоги?
Стефан Шазелас

Відповіді:


10

Використовуйте findдля цього:

find . ! -name '.*' ! -type d -exec rm -- {} +

1
Не у всіх знайдених реалізаціях є-delete
wurtel

3
@RomeoNinov, будь ласка, прочитайте питання OP:I do not want to delete hidden (dot) files.
jimmij

1
@Costas, ні, немає оболонки, яка потребує втечі +(принаймні, не в родинах Bourne, csh або rc). Існує легенда, яка говорить, що деякі старі версії cshвимагають втечі, {}але я ніколи не стикався з ними.
Стефан Шазелас

1
@ScottWilton Приховані каталоги включені, але приховані файли в прихованих каталогах немає. Якщо ви хочете відхилити всі файли у прихованих каталогах, тоді find . ! -name '.*' ! -type d ! -path '*/.*'слід виконати цю роботу.
jimmij

1
@jimmy, більше хотіли find . -name '.?*' -prune -o ! -type d -exec rm {} +б взагалі не спускатися з них. Зауважте, що --тут не потрібно (не шкодить), оскільки починаються шляхи ./.
Стефан Шазелас

0

спробуйте щось на кшталт:

find <path> ! -name '.*' -type f -exec rm {} \;

Будь-яка причина, чому видаляти файли по одному, а не прискорювати роботу .... -exec rm {} + ?
Антон

Я вважаю за краще робити речі по черзі. Масові (і паралельні) операції мають деякий час дивні (і неприємні) побічні ефекти (оскільки роблять величезне навантаження на підсистему вводу-виводу)
Ромео Нінов

1
-exec rm {} +не є паралельною, вона просто дзвінки rmз кількома іменами файлів. У ньому працює менше rmвикликів, тим зручніше використання ресурсів. Якщо він трохи менш безпечний, він збільшує вікно гонки, в якому компонент каталогів файлів для видалення може бути змінений на симпосилання. Але тільки -deleteабо -execdir rm {} \;повністю вирішив би це.
Стефан Шазелас

@ StéphaneChazelas, не такі (-delete або -execdir) існують в UNIX. І я не бачу в питанні згадувати linux!
Ромео Нінов

@RomeoNinov, так, я сказав в іншому коментарі тут, що тільки -execстандарт. -deleteі -execdirпоходять з BSD, однак GNU додав їх приблизно через 10 років. У будь-якому випадку це не має нічого спільного з Linux, що є лише ядром.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.