Quería eliminar algún paquete en mi archivo de inicio, pero el nombre del archivo era demasiado largo ( google-chrome-stable_current_i386.deb
). Entonces, decidí usar el comando ls|grep chrome|rm
para canalizar los archivos a grep para filtrar el archivo de Chrome, y luego eliminarlo. No funcionó, así que me gustaría ver cómo puedo hacer esto.
33
rm -i *chrome*.deb
ls
find
-find . -name "*chrome*" -delete
.ls
a travésgrep
derm
, pero no pudo conseguir que funcione. De esa forma, obtendrá una o dos buenas respuestas sobre la forma "correcta" o "más fácil" de realizar su tarea en lugar de obligar a alguien a darle una buena respuesta sobre una solución ineficiente.Respuestas:
Esto casi me hizo estremecer.
ls
será más complicado y propenso a errores que los métodos establecidos comofind [...] -exec
o globs .rm google
y presiona Tab. Si no se completa de inmediato, presione Tabnuevamente para ver una lista de archivos coincidentes. Escriba más caracteres del nombre de archivo para reducirlo hasta que se complete, luego ejecute el comando.fuente
rm
: es probablemente la forma más común de freír su distribución.También puede usar el comando find con un comodín:
Tenga en cuenta que el argumento "-maxdepth" asegura que find solo funciona en el directorio actual y no se repite en subdirectorios.
fuente
-iname
para nombres de archivo que no distinguen entre mayúsculas y minúsculas (b) paraxargs
usar-print0
flag forfind
y-0
flag forxargs
. El uso de lexargs
permite hacer cosas como eliminaciones "interactivas" (¿confirmar eliminarfoo
?).find . -name '*chrome*' -exec rm -i {} +
maxdepth
que sea 1.Tuviste la idea correcta, te perdiste algunos detalles. Como se trata de una lista que llega a STDIN y
rm
espera parámetros, debe usarlaxargs
.Así:
Debería darte lo que quieres.
Tenga en cuenta que si desea eliminar todo lo que no sea el
chrome
archivo, simplemente puede agregarlo-v
a lagrep
declaración.Tenga en cuenta que, según las otras respuestas a esta pregunta, esta es probablemente una mala forma de lograr lo que desea lograr.
fuente
-v
, ¿no eliminaría esto todo excepto los archivos que coincidenchrome
? No creo que eso sea lo que quiere el OP ...ls
salida. Los nombres de archivo con espacios arruinarán esto. Esto también es peligroso si alguien puede construir un nombre de archivo con salsa especial en el directorio donde ejecuta esto. Como ya ha señalado más de una persona, ¡no analice la salida de ls !Nunca analice la salida de ls
Mi sugerencia es evitar analizar la salida de ls [ 1 ] , incluso más si está junto con el
del
comando. Esto, por muchas razones, se relaciona principalmente con caracteres inesperados y no habituales permitidos en el nombre del archivo.Incluso cuando debe esperar que los nombres de archivo que pertenecen a los paquetes de Linux "se comporten bien" , este problema puede aparecer si otros archivos están presentes en el mismo directorio pero no lo sabía ni lo notó.
Es mejor usar
find
la expansión de pestañas (comience a escribir el nombre y presione Tab), la expansión del nombre de archivo [ 2 ] como*MyKey*
...Una solución rápida
Dado que desea seleccionar todos los paquetes (que terminan con
.deb
) con "google" dentro, puede crear su solicitud con el comodín*
*google*.deb
y hacer un simpleque seleccionará cada nombre de archivo con "google" en el medio que finalizará para estar
.deb
presente en el directorio actual. La opción-i
(interactiva) solicitará la confirmación, un buen hábito cuando elimina archivos con la expansión de parámetros.Una solución cercana a la filosofía de su intento
Si su propósito es construir su línea de comando pieza tras pieza, de modo que lo haya hecho
ls
, despuésls | grep google
y solo después de verificar su salida , puede ejecutarlo en una subshell$(...)
conUna forma más rápida y peligrosa [ 3 ] es utilizar
!!
que ejecutará el último comando terminado en su historial . Puede protegerse del hecho de que no tiene control visual de la línea que va a ejecutar si ha habilitado de antemano las opciones de shell
histverify
conshopt -s histverify
.fuente
... use
-name '*c*.deb'
o algún otro patrón que más le convenga.fuente
rm
no acepta entradas destdin
. Tendrás que hacer algo comols google-chrome* | xargs rm
fuente