[R] “rm -rf dosyaadı [co]” komutunda ne anlama geliyor?


16

Diyelim ki içinde iki dosya var /tmp:

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

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

Şimdi, rm -rfkomutu [co] seçeneğiyle çalıştıralım

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

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

Birisi burada neler olduğunu açıklayabilir mi? Nedir [co]parametre? Diğer uzantılar için nasıl çalışmasını sağlayabiliriz? Say Ben foo.jsve foo.coffeebiz böyle bir şey yapabiliriz, dosyalar rm -rf /tmp/foo.coffe[co]silmek /tmp/foo.js?


8
-rfNe dizin ( --recursive) ne de yazılamaz ( --force) olduğu için oraya gerek yoktur .
deltab

13
Gerek yok -rfve kök olarak bir şeyler yapmaya gerek yok. Özellikle de söz konusu şeyler varsa rm -rf.
terdon

Çocuklar, sorunu açıklamak için örnek komutlar. Asıl soru [co]kabuk küresi ile ilgiliydi . Teşekkürler.
aneeshep

8
@aneeshep Birisi bir silahın namlusuna bakıyor ve nasıl temizleneceğini soruyorsa, önce onları namluya bakma konusunda uyarır mısın yoksa nasıl temizleyeceğini söyler misin?
Duncan X Simpson

Yanıtlar:


34

[co]rmkomuta bir parametre değildir - kümedeki tek bir karaktere eşit bir desenle eşleşen bir kabuk küresi[co] - başka bir deyişle, dosya adının a cveya oa sonuyla eşleşir . Gönderen man bash:

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

Her iki eşleştirmek için foo.coffeeve foo.jsekleri hiç bir ortak alt dizeleri içermeyen beri, en iyi sensin yapabileceği foo.*eşleşir herhangi başlayarak dosya adı foo.Bunun yerine kullanabilirsiniz ayracı genişletme örneğin

rm foo.{coffee,js}

Yup anladı. Ben bash temel kavram özledim;). Teşekkür ederim :)
aneeshep

7
desenleri aramak gibi [abc]ya *olacak dosyaları aramak ise {}olmaz. / tmp, türüne gidin echo nya[ab]; echo nya{a,b}, sonra touch nyaatekrarecho nya[ab]; echo nya{a,b}
Sanya_Zol

16

Bu bir parametre değil, harflerin bir toplamıdır (ya da bir "kabuk küresi"). Bu aynısı:

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

aynıdır

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

Benzer ...

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

ASCII siparişini /tmp/hello.pyciçeren ve bu /tmp/hello.pyoASCII siparişini içeren her şeyi silebilir .

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

kaldırır ...

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

demek, foo.js ve foo.coffee dosyaları var, rm -rf /tmp/foo.coffe[co]silmek gibi bir şey yapabilir miyiz /tmp/foo.js.

Oldukça süslü yöntemler yapabilirsiniz, ancak bu 2 dosya için her biri için 1 komutla bunları kaldıracağım. Bu 2 dosyaya mümkün olduğunca yaklaşan başka bir örnek ...

rm /tmp/foo.[cj]*

böyle dosyaları kaldıracaktı ...

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

bu nedenle bu 2 dosyadan çok daha fazlasını içerir.


2
Eğer yanlış anlamadıysam rm -rf, tüm maçlarda birer çağrı alırsınız , her birinde bir maçta çok fazla çağrı olmaz.

1
Evet. ama ekledi rm's niyet değil. bunlar sadece eşdeğer olarak yazılması gerekenleri göstermek içindir ;-)
Rinzwind

1

Bu, joker karakterlere benzer bir kabuk glob *ve ?... bash'da, dosya adı deseni veya *.[co]ile biten tüm dosya adlarıyla eşleşir ..c.o

İle farkı *.[co]versus *.c *.oveya *.{c,o}iki ikincisi desenler manken genişler olmasıdır *.ohiçbir eğer .odosya dizinde iken, *.[co]sürüm olmaz.

Kabuk globları dosya işlemlerini büyük / küçük harfe duyarlı olmayan bir şekilde yapmak için kullanışlıdır. Eğer bu son ile dosya adlarına sahip dosyaların bir grup var Örneğin, jpg, JPG, Jpg, JPgvb ... ve hepsini kaldırmak istiyor, bunu yapabilirsiniz:

rm *.[Jj][Pp][Gg]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.