Чи видаляє 'rm файли *' всі збіги з усіх підкаталогів?


13

Я хочу видалити будь-який файл, схожий wordpress-891.sqlз поточного каталогу (не всередині підкаталогів).

Зробить rm wordpress-*.sqlтрюк чи він також видалить збіги з підкаталогів?


1
На відміну, хоча всі інші відповіді закінчуються правильними, є ще один поворот: насправді bash, а не команда rm, розширює підстановку. Якщо у вашому каталозі є десять відповідних файлів, rm не побачить підстановку, а лише десять окремих аргументів. Якщо ви хочете, щоб rm зробила розширення, вам доведеться долучити свій аргумент в окремі лапки. Для rm це не має значення, але в інших контекстах це може бути. Зазвичай, коли підказки посилаються на щось інше, ніж файли, наприклад пакети apt-get.
— Кевін Кін

3
@KevinKeane, rmне робить розширення імені файлів ... rm "foo*"спробує видалити файл з буквальною зірочкою в імені.
— ilkkachu

Відповіді:


20

Ні. Звичайний глобус *не є рекурсивним і не є rm.

Якщо ім'я каталогу збігається, воно не буде видалено - вам потрібно -rпрапор, щоб видалити каталог.

Тому це безпечно, якщо ви впевнені, що хочете видалити ці файли.

Ви також можете зробити rmінтерактивним

rm -i wordpress-*.sql

тоді він буде запитувати підтвердження перед видаленням кожного файлу


14

Так, це робить трюк для вас і видаляє всі файли з цією схемою в поточному каталозі. І НІ, він не видаляє файли в підкаталогах.

Ніколи ви не впевнені, що відбувається під час виконання команди, наприклад:

rm wordpress-*.sql

тоді просто запустіть його за допомогою ls:

ls wordpress-*.sql

файли, які ви бачите на виході, - це ті, які буде видалено.

Коли ви намагаєтеся отримати такий список, як:, foo*краще використовувати -dперемикач з, lsщоб запобігти переліку файлів без каталогу з іменем foobar/тощо.

ls -d foo*

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

Інше, що ви можете зробити - це ввести бажаний ввід, наприклад: wordpress-*потім натисніть Ctrl+ Alt+ *, і тепер всі збіги вводяться автоматично перед вашою командою.


4
Мій улюблений метод:printf "%s\n" wordpress-*.sql
— wjandrea

1
Ви також можете робити вигляд, як Ехо echo rm file*. Особливо шукайте ворожі назви файлів типу-rf
— eckes

@eckes: Ви можете охопити ці безпечніше будь-яким rm ./*або rm -- *.
— Девід Фоерстер

Так, або скористайтеся xargs -0@DavidFoerster
— eckes

якщо ви переходите, ls foo*і у вас є названий каталог foobar, ви також отримуєте перелік вмісту цього каталогу, тому звичайний lsнасправді не найкращий спосіб того, що rmпотрапить
— ilkkachu

12

Ні, rmне повторюється через підкаталоги.

Див. Розділ Видалення відповідних файлів у всіх підкаталогах - SuperUser щодо методів видалення файлів у підкаталогах.

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


Дякую за gvfs-trashзгадку, що дізналися, що сьогодні навряд чи використовують ...
— Джордж Удосен,

-1

Якщо ви хочете знайти і видалити всі відповідні файли, такі як wordpress-*.sql, ви можете скористатися findкомандою. :)

Наприклад, ви хочете видалити всі відповідні файли з wordpress-*.sqlпунктом "under" test_dir, виконайте такі дії.

cd test_dir
find . -name "wordpress-*.sql" -exec rm -f {} \;

Кожен раз, коли findпрограма дійсно знаходить відповідний файл, вона намагається виконати команду, наступна за -execопцією. У цьому випадку rm -f {}буде виконано і {}буде змінено назву файлу відповідності. Напр

rm -f wordpress-169.sql

Ви також можете встановити глибину підкаталогів з -maxdepthопцією.

cd test_dir
find . -maxdepth 3 -name "wordpress-*.sql" -exec rm -f {} \;

Зверніть увагу, що ви повинні вказати -maxdepthваріант перед іншими параметрами. Інакше ви можете зустріти результати, які ви насправді не хочете бачити.


1
ОП хоче навпаки: не повторюватись у підкаталогах.
— Мелебій

2
GNU find: "параметри впливають на всі тести, включаючи тести, визначені перед опцією", перелік нижче наведених варіантів -maxdepth. Використовуйте, -exec rm -f {} +а не -exec \;, а ще краще, просто-delete
— ilkkachu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.