opciones alternativas a rm -f

10

Me gustaría ejecutar una línea de comando:

cd ~/www/tmp/; rm -P 2*

Pero recibo un error si no hay archivos que comiencen con 2.

-fSin embargo, usted pensaría que me gustaría usar :

-f      Attempt to remove the files without prompting for confirmation, regardless of the file's permissions.  If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error.

Y yo hago la atención sobre el archivo permissions- si hay algo raro pasa, yo preferiría la orden de interrupción. Solo quiero suprimir los errores 'no existe'.

He examinado algunas otras preguntas con 'errores rm', y he encontrado estas dos que parecen (algo) relevantes:

Eliminar archivos y directorios por sus nombres. El fichero o directorio no existe

Pero, no entiendo todo lo que sucede en las respuestas a esta pregunta, y no sé si lo necesito.

El touchtruco sugerido en esta pregunta:

¿Rm no informa cuando falta un archivo?

Parece viable, ya que no creo que me importe el golpe de rendimiento (pero ¿qué tipo de golpe de rendimiento tomarías? Es decir, ¿es esta una técnica razonablemente escalable o solo estoy aprendiendo hábitos muy malos?)

No estoy seguro de cómo haría un if-thendentro de la línea de comando.

¿Hay alguna otra opción para una simple limpieza de línea de comando cortar-pegar?

¿ find -deleteFuncionaría mejor para mi caso? Si es así, ¿por qué?


error en cuestión:

rm: 2*: No such file or directory
usuario3082
fuente
1
El error es de su shell, no rm, así que tendrá que decir qué es eso.
Michael Homer
¿Está utilizando zshcomo su shell interactivo? ¿Estás recibiendo un No matches founderror?
Kusalananda
2
@MichaelHomer No, el error es de rm. El shell simplemente pasó la cadena 2*a rm en lugar de expandirla a una lista de archivos. Mire el error en cuestión: dice que rm se queja, no sh / bas / zsh / ...
doneal24

Respuestas:

13

Sólo para llamar rm -Ppor existente archivos regulares cuyos nombres coinciden con un patrón en un directorio (pero no por debajo):

find directory -maxdepth 1 -type f -name 'pattern' -exec rm -P {} +

P.ej,

find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +

Para hacer coincidir solo los no directorios, use ! -type den lugar de -type f. La diferencia es que ! -type dsería cierto para una gama más amplia de tipos de archivos (enlaces simbólicos, canalizaciones con nombre, sockets, etc.)

Puesto que desea que se le pregunte para algunas condiciones sobre los archivos encontrados, se debe no utilizar -deleteen lugar de -exec rmdesde que funciona como rm -f.

Eliminar -maxdepth 1para dejar findmirar en subdirectorios de forma recursiva.

Kusalananda
fuente
3
Aunque ! -type dpodría estar más cerca rm 2*, creo.
muru
Entonces, ¿tendría que agregar -P para obtener esa funcionalidad ?:find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +
user3082
@ user3082 Sí, olvidé que también querías usar -P.
Kusalananda
Gracias @muru, realmente quiero -type f, pero no sabía cómo rmactuar así, así que la sugerencia de @ Kusalanada fue acertada, y la diferenciación / explicación es excelente para aprender.
user3082
@ user3082 probablemente tenga que usar el globbing extendido de su shell (por ejemplo, rm 2*(.)en zsh).
muru