Чи видаляє '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.