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?
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?
Yanıtlar:
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ı.
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.
bash-4.3bir gerileme olduğunu unutmayın *(1)*.
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 :)
{bir ayraç, (bir paren (veya yuvarlak parantez).
{= 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.
{bir çiçek dirsek, [bir köşeli ayraç ve (yuvarlak bir dirsek veya daha yaygın olarak sadece dirsek. :-)
rmbir kalıpla kullansam , her zamanechoası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ırarakDEL *.* A:).