Mi aspettavo che:
$ rm *(1)*
rimuoverebbe tutti i file che contengono (1)
nel nome. Mi sbagliavo. Ha rimosso tutti i file nella directory.
Perché?
Mi aspettavo che:
$ rm *(1)*
rimuoverebbe tutti i file che contengono (1)
nel nome. Mi sbagliavo. Ha rimosso tutti i file nella directory.
Perché?
Risposte:
Da man bash
:
*(pattern-list)
Matches zero or more occurrences of the given patterns
Hai un'espressione glob che corrisponde ai file che iniziano con zero o più 1
s - che è tutti i file.
Un modo semplice per disabilitare questo comportamento sconvolgente è \
sfuggire alle parentesi:
rm *\(1\)*
Altrimenti puoi usare shopt -u extglob
per disabilitare il comportamento e shopt -s extglob
per riattivarlo:
shopt -u extglob
rm *(1)*
shopt -s extglob
Si noti che, come dice Stephane , extglob
è abilitato bash-completion
disabilitando in modo tale che le funzioni di completamento potrebbero non funzionare correttamente.
extglob
non è attivo per impostazione predefinita ma è attivato da bash_completion se lo hai installato e abilitato. bash
non ha portata locale per le opzioni come zsh
fa.
bash-4.3
ha una regressione in quanto *(1)*
espande anche i file nascosti.
Ciò è probabilmente correlato extglob
all'opzione shell. Se lo spengo, il modello produce un messaggio di errore:
martin@dogmeat:~$ shopt -u extglob
martin@dogmeat:~$ shopt extglob
extglob off
martin@dogmeat:~$ echo *(1)*
bash: syntax error near unexpected token `('
Se lo accendo, sembra davvero corrispondere a tutto. La manpage documenta questi schemi, penso che siano correlati:
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
Non vedo alcuna documentazione che specifichi cosa fanno le parentesi senza un protagonista. Ad ogni modo, puoi aggirare il problema citando le parentesi:
martin@dogmeat ~ % echo *\(1\)*
A(1)b
Inoltre, usa echo
o ls
per testare prima il tuo modello se non sei assolutamente sicuro che funzioni :)
{
è un tutore, è una parentesi (
(o parentesi tonda).
{
= parentesi graffa, (
= parentesi tonda, [
= parentesi quadra. In americano: {
= parentesi graffa, (
= parentesi , [
= parentesi. Un po 'confuso. Se hai mai bisogno di controllare come si chiama qualcosa, Jargon File - ASCII è abbastanza utile.
{
è una parentesi di fiori, [
è una parentesi quadra ed (
è una parentesi tonda o più comunemente solo parentesi. :-)
rm
con un modello, lo precedo sempreecho
prima di eseguire il comando effettivo. L'abitudine mi ha salvato più di una volta (da allora, a 6 anni circa, confondendo la differenza traDEL A: *.*
eDEL *.* A:
).