Допустим, у меня есть два файла в / 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[cohibited
, чтобы удалить /tmp/foo.js
?
[co]
не параметр к rm
команда - это - шарик оболочки, который соответствует шаблону, равному отдельному символу от набора [co]
- другими словами, это соответствует любому a c
или o
конец имени файла. От man bash
:
[...] Matches any one of the enclosed characters
Соответствовать обоим foo.coffee
и foo.js
, так как суффиксы не содержат общих подстрок вообще, лучшее, которое Вы могли сделать, foo.*
который соответствовал бы любому имени файла, запускающемуся с foo.
Вместо этого Вы могли использовать расширение фигурной скобки, например.
rm foo.{coffee,js}
Это не параметр, а набор букв (или "шарик оболочки"). Это - то же:
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
.
можно сделать довольно необычные методы, но для тех 2 файлов я просто удалил бы их с 1 командой для каждого. Другой пример, становящийся максимально близким к тем 2 файлам...
rm /tmp/foo.[cj]*
удалил бы файлы как это...
rm /tmp/foo.c*
rm /tmp/foo.j*
, таким образом, это включало бы намного больше, чем просто эти 2 файла.
Это - шарик оболочки, подобный подстановочным знакам *
и ?
... в ударе, шаблоне имени файла *.[co]
соответствия все имена файлов тот конец с .c
или .o
.
Различие с *.[co]
по сравнению с *.c *.o
или *.{c,o}
это, два последних шаблона расширятся до макета *.o
если нет .o
файлы существуют в каталоге, в то время как *.[co]
версия не будет.
Шарики Shell полезны для того, чтобы сделать операции файла нечувствительным к регистру способом. Например, если у Вас есть набор файлов с именами файлов тот конец с jpg
, JPG
, Jpg
, JPg
, и т.д.... и Вы хотите удалить всех их, можно сделать:
rm *.[Jj][Pp][Gg]