¿Qué significa [co] en el comando "rm -rf filename [co]"?

16

Digamos que tengo dos archivos en /tmp:

root@ubuntu:~# touch /tmp/hello.{pyc,py}

root@ubuntu:~# ls /tmp/
hello.py  hello.pyc

Ahora, ejecutemos el rm -rfcomando con la opción [co]

root@ubuntu:~# rm -rf /tmp/hello.py[co]

root@ubuntu:~# ls /tmp/
hello.py

¿Alguien puede explicar qué está pasando aquí? ¿Cuál es el [co]parámetro? ¿Cómo podemos hacer que funcione para otras extensiones? Digamos que tengo foo.jsy foo.coffeearchivos, ¿podemos hacer algo como rm -rf /tmp/foo.coffe[co]eliminar el /tmp/foo.js?

aneeshep
fuente
8
No es necesario -rfallí, ya que no son directorios ( --recursive) ni no escribibles ( --force).
deltab
13
No hay necesidad -rfy no hay necesidad de hacer cosas como root. Especialmente si las cosas en cuestión involucran rm -rf.
terdon
Chicos, son solo comandos de muestra para explicar el problema. La pregunta real era sobre el [co]globo de concha. Gracias.
aneeshep
8
@aneeshep Si alguien está mirando hacia abajo por el cañón de una pistola y preguntando cómo limpiarlo, ¿primero les advierte sobre mirar hacia abajo o les dice cómo limpiarlo?
Duncan X Simpson

Respuestas:

34

[co]no es un parámetro para el rmcomando: es un globo de shell que coincide con un patrón igual a un solo carácter del conjunto [co]; en otras palabras, coincide con a co oa al final del nombre de archivo. De man bash:

[...]  Matches any one of the enclosed characters

Para hacer coincidir ambos foo.coffeey foo.js, puesto que los sufijos no contienen subcadenas comunes a todos, lo mejor que podría hacer es foo.*que coincida con cualquier nombre de archivo empezando por foo.el contrario usted podría utilizar la expansión de llaves por ejemplo,

rm foo.{coffee,js}
conductor de acero
fuente
Sí lo tengo. Eché de menos el concepto básico en bash;). Gracias :)
aneeshep
77
buscar patrones como [abc]o *buscará archivos mientras {}que no lo hará. vaya a / tmp, escriba echo nya[ab]; echo nya{a,b}, luego touch nyaay otra vezecho nya[ab]; echo nya{a,b}
Sanya_Zol
16

No es un parámetro sino una colección de letras (o un "shell glob"). Esto es lo mismo:

rm -rf /tmp/hello.py[co]

es lo mismo que

rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo

Similar ...

rm -rf /tmp/hello.py[c-o]

eliminaría cualquier cosa /tmp/hello.pychasta e incluyendo el /tmp/hello.pyosiguiente pedido ASCII.

rm -rf /tmp/hello.py[ab][cd]

eliminaría ...

rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd

digamos, tengo archivos foo.js y foo.coffee, ¿podemos hacer algo como rm -rf /tmp/foo.coffe[co]eliminar el /tmp/foo.js.

Puede crear métodos bastante sofisticados, pero para esos 2 archivos simplemente los eliminaría con 1 comando para cada uno. Otro ejemplo acercándose lo más posible a esos 2 archivos ...

rm /tmp/foo.[cj]*

eliminaría archivos como este ...

rm /tmp/foo.c*
rm /tmp/foo.j*

por lo tanto, incluiría mucho más que solo estos 2 archivos.

Rinzwind
fuente
2
Si no estoy malentendido, obtienes una invocación de rm -rftodas las coincidencias, no muchas invocaciones cada una con una coincidencia.
1
si. pero no la intención de los rm que agregué. son solo para mostrar lo que se necesitaría para escribir como equivalente ;-)
Rinzwind
1

Es un globo de shell, similar a los comodines *y ?... en bash, el patrón de nombre de archivo *.[co]coincide con todos los nombres de archivo que terminan con .co .o.

La diferencia con *.[co]versus *.c *.oo *.{c,o}es que los dos últimos patrones se expandirán a un ficticio *.osi no .oexisten archivos en el directorio, mientras que la *.[co]versión no.

Los globos de shell son útiles para realizar operaciones de archivo sin distinción entre mayúsculas y minúsculas. Por ejemplo, si usted tiene un montón de archivos con nombres de archivo que terminan con jpg, JPG, Jpg, JPg, etc ... y desea eliminar todos ellos, que puede hacer:

rm *.[Jj][Pp][Gg]
delt
fuente