Yo esperaba que:
$ rm *(1)*
eliminaría todos los archivos que contengan (1)
el nombre. Estaba equivocado. Eliminó todos los archivos en el directorio.
¿Por qué?
Yo esperaba que:
$ rm *(1)*
eliminaría todos los archivos que contengan (1)
el nombre. Estaba equivocado. Eliminó todos los archivos en el directorio.
¿Por qué?
Respuestas:
De man bash
:
*(pattern-list)
Matches zero or more occurrences of the given patterns
Tiene una expresión global que coincide con los archivos que comienzan con cero o más 1
s, que son todos los archivos.
Una forma simple de deshabilitar este comportamiento global es \
escapar de los paréntesis:
rm *\(1\)*
De lo contrario, puede usar shopt -u extglob
para desactivar el comportamiento y shopt -s extglob
volver a habilitarlo:
shopt -u extglob
rm *(1)*
shopt -s extglob
Tenga en cuenta que, como dice Stephane , extglob
se habilita al bash-completion
deshabilitarlo, lo que puede provocar que las funciones de finalización no funcionen correctamente.
extglob
no está activado de manera predeterminada, pero está activado por bash_completion si lo tiene instalado y habilitado. bash
no tiene alcance local para opciones como lo zsh
hace.
bash-4.3
tiene una regresión que *(1)*
también expande los archivos ocultos.
Esto probablemente esté relacionado con la extglob
opción de shell. Si lo apago, el patrón produce un mensaje de error:
martin@dogmeat:~$ shopt -u extglob
martin@dogmeat:~$ shopt extglob
extglob off
martin@dogmeat:~$ echo *(1)*
bash: syntax error near unexpected token `('
Si lo enciendo, de hecho parece coincidir con todo. La página de manual documenta estos patrones, creo que están relacionados:
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
No veo ninguna documentación que especifique lo que hacen los paréntesis sin un personaje principal. De todos modos, puede evitar el problema citando a los padres:
martin@dogmeat ~ % echo *\(1\)*
A(1)b
Además, use echo
o ls
para probar su patrón primero si no está absolutamente seguro de que está funcionando :)
{
es un paréntesis, (
es un paréntesis (o paréntesis redondo).
{
= corchete, (
= corchete, [
= corchete. En americano: {
= paréntesis, (
= paréntesis, [
= paréntesis. Un poco confuso. Si alguna vez necesita verificar cómo se llama algo, Jargon File - ASCII es bastante útil.
{
es un corchete de flores, [
es un corchete cuadrado y (
es un corchete redondo o, más comúnmente, solo un corchete. :-)
rm
con un patrón, siempre lo precedoecho
antes de emitir el comando real. El hábito me salvó más de una vez (desde entonces, a los 6 años, confundiendo la diferencia entreDEL A: *.*
yDEL *.* A:
).