¿Por qué no encuentra / rm -iname '* phpmyadmin' delete phpMyAdmin-Version-XYZ.zip?

8

Tengo este siguiente código:

find ./ -iname '*phpmyadmin' -exec rm -rf {} \;

Elimina un directorio llamado phpmyadmin, pero no elimina un archivo llamadophpMyAdmin-Version-XYZ.zip

Incluso si elimino el -rf, todavía no lo eliminará (probablemente debido a un segundo problema con el -iname que no afecta la insensibilidad a mayúsculas y minúsculas).

  1. ¿Hay alguna forma de eliminar cualquier inodo en un único rm (archivo, directorio, softlink)?
  2. ¿Por qué agregar el -inameno tiene efecto?

Nota: No encontré un argumento de "eliminar ningún inodo" en man rm.

derobert
fuente
1
Si lo findadmite, intente la -deleteacción. (Además, vea gnu.org/software/findutils/manual/html_node/find_html/… para una extensa discusión sobre las muchas formas de hacer esto incorrectamente.)
zwol

Respuestas:

31

El problema es que está haciendo coincidir un archivo que termina phpmyadmin( sin distinción entre mayúsculas y minúsculas ) utilizando el patrón *phpmyadmin. Para obtener cualquier archivo que contenga la cadena phpmyadmin(sin distinción entre mayúsculas y minúsculas), use -iname '*phpmyadmin*':

find ./ -iname '*phpmyadmin*' -exec rm -rf {} \;

Quizás obtener los archivos coincidentes antes de la eliminación sería sensato:

find ./ -iname '*phpmyadmin*'

Para responder a su primera pregunta, no hay ninguna opción rmen el espacio de usuario para tratar los inodos.

heemayl
fuente
1
Posiblemente debería considerarlo -depthpara que findno intente volver a aparecer en un directorio que acaba de eliminar.
roaima
8
Para no quitarle nada a la respuesta, que incluye esto, pero solo quería enfatizar que la razón por la cual el comando del OP no eliminó el archivo zip fue que no lo encontró , debido a la falta del final '* 'en el patrón.
Gwyn Evans
3
@GwynEvans Eso también significa que OP no probó findantes de agregar el -execparámetro. Muy peligroso.
Tulains Córdova
Podría sugerir -exec rm -rf {} +: no tiene sentido la penalización de rendimiento de ejecutar uno rmpor archivo.
Charles Duffy,
2
find ./ -iname '*phpmyadmin*' -exec /usr/lib/klibc/bin/nuke {} +

Esto funciona incluso si alguien crea un directorio -phpmyadmin.

Joshua
fuente
Buscar (al menos aquí) pone prefijos a los nombres ./, por lo que no es necesario: se ejecutará rm -rf ./-phpmyadmin, lo que debería funcionar con cualquier persona sensata rm. Trate find ./ -iname '*whatever*' -exec echo '{}' ';'de probar
derobert
@derobert: He tenido problemas en un puñado de ocasiones. Una vez mordido dos veces tímido. Tal vez solo puede suceder si el argumento para encontrar es algo así como '-annoyingdirectoryname'.
Joshua
1
Si alguien ejecutó, digamos, en find */lugar de hacerlo find ., eso lo haría (si un nombre de directorio coincidente comenzara con un guión). Dicho esto, tendería a sugerir el uso --para manejar tales casos proporcionando un final de opciones explícito antes del {}argumento. (Ver # 10 en las pautas de sintaxis de la utilidad POSIX )
Charles Duffy
1
Por otro lado, {} +es considerablemente más eficiente que {} \;, ya que solo ejecutará tantas instancias de su comando ( nukeen este caso) como sea necesario para adaptarse a todos los elementos encontrados en la línea de comando, en lugar de uno por cada uno.
Charles Duffy
@CharlesDuffy Si se ejecutaran, find */entonces el problema no ocurriría -exec, el directorio con un guión parecería ser una findopción y se quejaría.
Barmar