Rm * (1) * neden bir dizindeki tüm dosyaları kaldırıyor?


47

Bunu bekliyordum:

$ rm *(1)*

(1)adında bulunan tüm dosyaları kaldırır . Ben hatalıydım. Dizindeki tüm dosyaları kaldırdı.

Neden?


5
Ne zaman rmbir kalıpla kullansam , her zaman echoasıl komutu vermeden önce ondan önce gelirim . Alışkanlık beni bir kereden fazla kurtardı (o zamandan beri, 6 yaşından beri, DEL A: *.*ve arasındaki farkı karıştırarak DEL *.* A:).
gerrit

Yanıtlar:


51

Kimden man bash:

*(pattern-list)
                 Matches zero or more occurrences of the given patterns

Sıfır veya daha fazla 1s ile başlayan dosyalarla eşleşen bir glob ifadeniz var - ki bunlar tüm dosyalar.

Bu genelleme davranışını devre dışı bırakmanın basit bir yolu \parantezlerden kaçmaktır:

rm *\(1\)*

Aksi takdirde shopt -u extglob, davranışı devre dışı bırakmak ve shopt -s extglobyeniden etkinleştirmek için kullanabilirsiniz:

shopt -u extglob
rm *(1)*
shopt -s extglob

Olarak o Not Stephane diyor , extglobolarak etkindir bash-completionyüzden düzgün çalışması için değil tamamlama fonksiyonları neden olabilir devre dışı bırakılması.


7
Not extglobvarsayılan olarak değil ama yüklü ve etkin olduğu varsa bash_completion olarak açıktır. bashgibi seçenekler için yerel kapsama sahip değildir zsh.
Stéphane Chazelas

1
Ayrıca gizli dosyaları da genişleten bash-4.3bir gerileme olduğunu unutmayın *(1)*.
Stéphane Chazelas

@StephaneChazelas Bu regresyon ile ilgili bir bağlantınız var mı? Teşekkürler
Temel

2
@Basic, işte başlıyorsunuz . Chet henüz cevaplamadı.
Stéphane Chazelas

9

Bu muhtemelen extglobkabuk seçeneğiyle ilgilidir. Kapatırsam, desen bir hata mesajı verir:

martin@dogmeat:~$ shopt -u extglob
martin@dogmeat:~$ shopt extglob
extglob         off
martin@dogmeat:~$ echo *(1)*
bash: syntax error near unexpected token `('

Açarsam, gerçekten her şeyle eşleşiyor gibi görünüyor. Manpage bu kalıpları belgeliyor, sanırım birbirleriyle ilgili:

   If the extglob shell option is enabled using the shopt builtin, several
   extended  pattern  matching operators are recognized.  In the following
   description, a pattern-list is a list of one or more patterns separated
   by a |.  Composite patterns may be formed using one or more of the fol
   lowing sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

Baş karakter olmadan hangi parantezin yapıldığını belirten hiçbir belge göremiyorum. Her neyse, sorunu parelerden alıntı yaparak çözebilirsiniz:

martin@dogmeat ~ % echo *\(1\)*
A(1)b

Ayrıca, çalıştığından tam olarak emin değilseniz ilk önce kalıbınızı test etmek için kullanın echoveya lskullanın :)


Bilginize: {bir ayraç, (bir paren (veya yuvarlak parantez).
Mikel

Ah teşekkürler. Ben anadili İngilizce değilim, o yüzden
kafamı

6
İngilizcede: {= küme parantezi, (= yuvarlak ayraç, [= köşeli ayraç. Amerikan'da: {= ayraç, (= paren, [= ayraç. Biraz kafa karıştırıcı. Bir şeyin ne olduğunu kontrol etmeniz gerekirse Jargon File - ASCII oldukça yardımcı olur.
Mikel

4
@Mikel Teşekkürler, ayrıca burada kontrol ettim, bu yüzden şimdi çiçek parantezlerini ve sincapları da biliyorum !

Hint İngilizcesi, {bir çiçek dirsek, [bir köşeli ayraç ve (yuvarlak bir dirsek veya daha yaygın olarak sadece dirsek. :-)
ShreevatsaR
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.