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

13

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

Будет rm wordpress-*.sqlли уловка, или это также удалит совпадения из подкаталогов?

HorusCoding
источник
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+ *, и теперь все совпадения будут напечатаны автоматически перед вашей командой.

Ravexina
источник
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(который навсегда удаляет файлы).

wjandrea
источник
Спасибо за 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