'Rm files *' удаляет все совпадения из всех подкаталогов?


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под 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.