Як видалити всі файли в каталозі?


76

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

Наприклад, у мене є головний каталог, як images. Він містить файли header.png, footer.pngі підкаталог.

Тепер я хочу , щоб видалити header.png, footer.pngі підкаталог, але не images.

Як я можу це зробити в Linux?


1
CD в ​​каталог і зробити rm -Rfз усіх файлів і каталогів там.
Нуфал Ібрагім

Відповіді:


59

Якщо ваш каталог верхнього рівня викликається images, то запустіть rm -r images/*. Це використовує оператор глобальної оболонки *для запуску rm -rкожного файлу або каталогу в межах images.


30
прихований файл не буде видалений.
рето

50

Щоб видалити приховані файли, потрібно вказати:

rm -r images/* images/.*

Що стосується оболонок, чиї кулі включають, .і ..це призведе до помилок

rm: cannot remove `.' directory `images/.'
rm: cannot remove `..' directory `images/..'

але це видалить приховані файли.

Підхід без повідомлення про помилки - використовувати find / delete з mindepth. Це gnu-find.

find images -mindepth 1 -delete

У вашій знахідці може бути відсутність -mindepthабо -deleteпредикат, і в цьому випадку ви можете:

find images/. ! -name . -prune -exec rm -rf {} +

Моя пропозиція полягала в тому, щоб використовувати 'rm -r images /.*', який би відповідав 'images / ..', але не 'images /../ ..'. Рекурсія не може йти вгору, оскільки 'images /../ images / ..' - знову ж каталог.
користувач невідомий

4
@DarkHeart rm .*не видаляти .або ..й не має принаймні з 1994 роки для утилітами GNU та , ймовірно , з кінця 70 - х років для UNIX . Вкрай малоймовірно, що ви знайдете систему, в якій rm .*переходитиме файлова система вгору поза музеєм.
terdon

21

Щоб видалити всі файли та каталоги (включаючи приховані ) в каталозі, ви можете спробувати наступне:

  • використовувати ls -Abдля узгодження всіх файлів / каталогів

    cd dir_name && rm -rf `ls -Ab`
    
  • використовувати findдля узгодження всіх файлів / каталогів

    find dir_name -mindepth 1 -delete
    

    або, якщо ваш findне підтримує -delete:

    find dir_name -mindepth 1 -exec rm -rf {}
    
  • видаліть папку та відтворіть її

    rm -rf dir_name && mkdir dir_name
    
  • в баш,

    shopt -s dotglob  
    rm -rf dir_name/*
    

Зауважте, що команда like rm -rf *не є безпечною, якщо ви не знаєте файлів у каталозі, тому що файл, який починається з -(дефіс), буде інтерпретуватися як rmпрапор ...
VasyaNovikov

1
EDIT: щоб зробити це безпечно, використовуйтеrm -rf ./* ./.*
VasyaNovikov

9

Щоб видалити всі регулярні файли рекурсивно всередині каталогу, ця команда (припускаючи GNU або FreeBSD find) досить хороша:

find . -type f -delete

Це залишає всі нерегулярні файли, як символьні посилання (вказують вони на звичайні файли чи ні), каталоги, фіфоси, розетки, пристрої ...

Дивитися також:

find . ! -type d -delete

для видалення файлів будь-якого типу, крім каталогу .


6

Спробуйте цю версію:

 rm -r test/*

1
При цьому не буде видалено приховані файли (файли, що починаються з ".").
gbmhunter

3

Я findтут використовую команду:

Крок 1. Знайдіть усі файли та видаліть їх:

find /path/to/directory/ -type f -exec rm {} \;

Приклад:

find /home/user/Desktop/images/ -type f -exec rm {} \;

Крок 2. Знайдіть усі підкаталоги та видаліть їх:

find /path/to/directory/ -type d -exec rm -R {} \;

find /path/to/directory/ -type dвключає, .так буде видалити сам каталог. Вам також потрібно використовувати -mindepthперемикач, як сказали інші.
Артур Такка

3

Питання полягало в тому, щоб виповнити каталог = видалити вміст каталогу, включаючи приховані файли, але не сам каталог. Команда find з -mindepth 1 - це насправді правильний шлях, але щоб уникнути повідомлень про помилки, її слід з'єднати з -maxdepth 1:

find /path/to/dir -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \;

0

Синтаксис rm:

rm [OPTION]... FILE...

Отже, ви повинні чітко вказати відповідний шлях, наприклад

rm -r sub_dir/

0

Ви можете видалити каталог за допомогою наступної команди:

sudo rm -r directoryname1/2/3/*

Після 3 / * буде видалено весь каталог.

Приклад sudo rm -r Завантаження / пісня / *

Буде видалено всі файли, які знаходяться всередині Downloads/song.


0

Це прекрасно працює для мене, протестовані кілька варіацій працювали кожен раз.

З каталогу, який містить каталог зображень.

rm -frd ./images/*

перед:

images/
    |_ header.png
    |_ footer.png
    |_ subdir/

після:

images/

Не впевнений, що це було зрозуміло в первісному запитанні, але просто зазначити, що, якщо ви не включите dotglob, це пропустить будь-який "dot-файл" або dot-каталог під зображеннями ( mkdir images/.somedir; touch images/.somefile)
Jeff Schaller

0

Щоб видалити всі файли та підкаталоги в поточному каталозі, включаючи приховані, без повідомлення про помилку :

rm -rf .[^.] .??* *

Або з батьківського каталогу:

rm -rf images/.[^.] images/.??* images/*

З https://serverfault.com/a/47940/269538 .



-2

Видаліть папку "test" та всі файли всередині:

 rm -r test

Видаліть усі файли всередині, але папку "тестуйте":

 rm -r test/*

-4

CD в ​​папку, потім виконати таку команду:

ls |xargs rm -rf

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