Що означає [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?


8
У цьому немає потреби -rf, оскільки це не є ні каталоги ( --recursive), ні непридатні ( --force).
дельтаб

13
Немає потреби -rfі не потрібно робити справи як корінь. Особливо, якщо стосуються речей rm -rf.
тердон

Хлопці, його просто зразок команди для пояснення проблеми. Актуальне питання [co]стосувалося глобула оболонки. Спасибі.
aneeshep

8
@aneeshep Якщо хтось дивиться вниз по стволі пістолета і запитує, як його почистити, попередньо попереджаєш їх про те, щоб дивитись на бочку або розповісти, як її очистити?
Duncan X Simpson

Відповіді:


34

[co]не є параметром для rmкоманди - це глобул оболонки, який відповідає шаблону, рівному одному символу з набору [co]- іншими словами, він відповідає або а, cабо oв кінці імені файлу. Від man bash:

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

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

rm foo.{coffee,js}

Так, це зрозуміло. Я пропустив основне поняття в баші;). Дякую :)
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.

Ви можете зробити досить фантазійні методи, але для цих 2-х файлів я просто видалю їх по 1 команді для кожного. Ще один приклад, максимально наближений до цих 2 файлів ...

rm /tmp/foo.[cj]*

видалить такі файли ...

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

тож воно включатиме набагато більше, ніж лише ці 2 файли.


2
Якщо я не розумію, ви отримуєте один виклик rm -rfіз усіма сірниками, а не багато викликів із кожним матчем.

1
так. але не наміри, які я додав. це лише для того, щоб показати, що потрібно було б набрати як еквівалент ;-)
Rinzwind

1

Це глобус оболонки, подібний до макіяжів *і ?... в баші, шаблон імені файлу *.[co]відповідає всім назви файлів, які закінчуються з .cабо .o.

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

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

rm *.[Jj][Pp][Gg]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.