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

15

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

[email protected]:~# touch /tmp/hello.{pyc,py}

[email protected]:~# ls /tmp/
hello.py  hello.pyc

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

[email protected]:~# rm -rf /tmp/hello.py[co]

[email protected]:~# ls /tmp/
hello.py

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

    
задан aneeshep 20.07.2016 в 12:14
источник

3 ответа

34

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

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

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

rm foo.{coffee,js}
    
ответ дан steeldriver 20.07.2016 в 12:23
источник
17

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

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 команде для каждого. Другой пример, как можно ближе к тем двум файлам ...

rm /tmp/foo.[cj]*

удалит такие файлы ...

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

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

ответ дан Rinzwind 20.07.2016 в 12:25
1

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

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

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

rm *.[Jj][Pp][Gg]
    
ответ дан delt 26.07.2016 в 19:45