Яка команда видалити всі файли, але не каталоги?


23

Скажімо, у мене є дерево каталогів таким:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Якби я використовував rm -r FOLDER/*, все з FOLDER буде видалено, включаючи підкаталоги. Як я можу видалити всі файли в папці FOLDER та в її підкаталогах, не видаляючи фактичні каталоги?

Відповіді:


37

Що ви намагаєтеся зробити - це рекурсивне видалення. Для цього вам потрібен рекурсивний інструмент, наприклад find.

find FOLDER -type f -delete

13

З bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Тут ітерація над глобальним розширеним іменем файлів і видалення лише файлів.

Вищезазначене є запущеним, якщо задоволені внесеними змінами, видаліть echoдля фактичного видалення:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Нарешті, скасуйте globstar:

shopt -u globstar

З zsh, використовуючи глобальний класифікатор:

echo -- FOLDER/**/*(.)

(.) є глобальним класифікатором, що обмежує глобальні розширення лише звичайними файлами.

Наведене вище буде просто друкувати назви файлів для фактичного видалення:

rm -- FOLDER/**/*(.)

2
+1 для zsh globbing. Більшість людей повинні знати про дивовижні речі, які може зробити zsh.
marcelm

11

Якщо ваша версія findне підтримує, -deleteви можете скористатися наступним, щоб видалити кожен файл у поточному каталозі та нижче.

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

-exec rm {} +було б швидше, особливо якщо файлів багато.
муру

І find . ! -type d -exec rm {} +видаляє також символьні посилання.
Справедливість для Моніки

1
@muru: Якщо певна реалізація findне підтримує, -deleteвона, ймовірно, також не підтримує -exec ... {} +. Рекомендований спосіб вирішити це find ... -print0 | xargs -r0 rm(якщо очікується багато потенційних матчів).
Девід Фоерстер

5
@DavidFoerster не дуже. -exec ... {} +є POSIX, але -deleteце не так. (І це -print0, до речі,)
муру

@muru: Досить справедливо. Я стикався щонайменше з двома не-POSIX- findреалізаціями, які підтримували, -print0але не -exec ... {} +(я не пам’ятаю про це -delete). Один був на OS X, другий на Solaris (кілька років тому на дуже консервативно оновленій системі). Ви також можете замінити -print0на -printf '%p\0'. У будь-якому разі, це Ask Ubuntu, а не Unix & Linux, і Ubuntu використовує GNU-пошук з усіх пір.
Девід Фоерстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.