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 1
s 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 extglob
yeniden etkinleştirmek için kullanabilirsiniz:
shopt -u extglob
rm *(1)*
shopt -s extglob
Olarak o Not Stephane diyor , extglob
olarak etkindir bash-completion
yüzden düzgün çalışması için değil tamamlama fonksiyonları neden olabilir devre dışı bırakılması.
extglob
varsayılan olarak değil ama yüklü ve etkin olduğu varsa bash_completion olarak açıktır. bash
gibi seçenekler için yerel kapsama sahip değildir zsh
.
bash-4.3
bir gerileme olduğunu unutmayın *(1)*
.
Bu muhtemelen extglob
kabuk 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 echo
veya ls
kullanı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. :-)
rm
bir kalıpla kullansam , her zamanecho
ası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:
).