Что означает [co] в команде «rm -rf filename [co]»?

16

Допустим, у меня есть два файла /tmp:

root@ubuntu:~# touch /tmp/hello.{pyc,py}

root@ubuntu:~# ls /tmp/
hello.py  hello.pyc

Теперь давайте запустим rm -rfкоманду с опцией [co]

root@ubuntu:~# rm -rf /tmp/hello.py[co]

root@ubuntu:~# ls /tmp/
hello.py

Может кто-нибудь объяснить, что здесь происходит? Какой [co]параметр? Как мы можем заставить его работать для других расширений? Скажем, у меня есть foo.jsи foo.coffeeфайлы, мы можем сделать что-то вроде rm -rf /tmp/foo.coffe[co]удаления /tmp/foo.js?

aneeshep
источник
8
В этом нет необходимости -rf, поскольку они не являются каталогами ( --recursive) и не записываются ( --force).
deltab
13
В этом нет необходимости -rfи нет необходимости делать что-либо как root. Особенно если речь идет о вещах rm -rf.
Тердон
Ребята, это просто примеры команд, чтобы объяснить проблему. Фактический вопрос был о [co]ракушке. Благодарю.
Aneeshep
8
@aneeshep Если кто-то смотрит в дуло пистолета и спрашивает, как его почистить, вы сначала предупредите его о том, как заглядывать в дуло, или говорите, как его почистить?
Дункан Х Симпсон

Ответы:

34

[co]не является параметром для rmкоманды - это оболочка Glob , что соответствует , равным одному символу из набора рисунка [co]- другими словами, он соответствует или cили oв конец файла. От man bash:

[...]  Matches any one of the enclosed characters

Для того, чтобы соответствовать как foo.coffeeи foo.js, так как суффиксы не содержат каких - либо общих подстрок на все лучшее , что вы можете сделать , это foo.*который будет соответствовать любое имя файла , начиная с foo.Вместо этого вы можете использовать скобки расширения , например ,

rm foo.{coffee,js}
steeldriver
источник
Да, понял. Я пропустил основную концепцию в bash;). Спасибо :)
Aneeshep
7
искать шаблоны, как [abc]или *будет искать файлы, пока {}не будет. перейдите в / tmp, наберите echo nya[ab]; echo nya{a,b}, затем touch nyaaи сноваecho nya[ab]; echo nya{a,b}
Sanya_Zol
16

Это не параметр, а набор букв (или «оболочка»). Это тоже самое:

rm -rf /tmp/hello.py[co]

такой же как

rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo

Аналогичный ...

rm -rf /tmp/hello.py[c-o]

удалит что-либо от /tmp/hello.pycдо и включая /tmp/hello.pyoпоследующий порядок ASCII.

rm -rf /tmp/hello.py[ab][cd]

удалил бы ...

rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd

скажем, у меня есть файлы foo.js и foo.coffee, можем ли мы сделать что-то вроде rm -rf /tmp/foo.coffe[co]удаления /tmp/foo.js.

Вы можете сделать довольно причудливые методы, но для этих двух файлов я бы просто удалил их по 1 команде для каждого. Другой пример, как можно ближе к этим 2 файлам ...

rm /tmp/foo.[cj]*

удалил бы файлы как это ...

rm /tmp/foo.c*
rm /tmp/foo.j*

поэтому он будет включать в себя гораздо больше, чем просто эти 2 файла.

Rinzwind
источник
2
Если я не ошибаюсь, вы получаете один вызов для rm -rfвсех совпадений, а не много вызовов для каждого совпадения.
1
да. но не намерение Р.М., которое я добавил. это только для того, чтобы показать, что нужно было бы ввести как эквивалент ;-)
Rinzwind
1

Это глобус оболочки, похожий на символы подстановки *и ?... в bash шаблон имени файла *.[co]соответствует всем именам файлов, которые заканчиваются на .cили .o.

Разница между « *.[co]против» *.c *.oили «в» *.{c,o}заключается в том, что два последних шаблона будут расширены до фиктивного, *.oесли в .oкаталоге нет файлов, а *.[co]версия - нет.

Глобусы оболочки полезны для выполнения файловых операций без учета регистра. Например, если у вас есть куча файлов с именами файлов , которые заканчиваются jpg, JPG, Jpg, JPgи т.д. ... и вы хотите , чтобы удалить все из них, вы можете сделать:

rm *.[Jj][Pp][Gg]
DELT
источник