Eliminar archivos específicos basados ​​en el nombre de archivo del terminal

13

Tengo un directorio que contiene archivos con nombres

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

y así. Me gustaría eliminar todos aquellos que son múltiplos de 5000.

Intenté lo siguiente: printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rmpero eso me dio la respuestarm: missing operand .

Hay otra manera de hacer esto?

BillyJean
fuente
66
Independientemente de cómo lo haga, le recomiendo (por seguridad) mover los archivos deseados a un directorio, luego, cuando haya confirmado que todos y solo los archivos a eliminar están en el directorio, elimine el directorio.
user117529
La seguridad es importante aquí. Generalmente pruebo estas cosas lsprimero.
Scot

Respuestas:

49

No necesita un bucle o comandos adicionales donde los tiene Bash Shell Brace Expansion.

rm -f rho_{0..200000..5000}.txt

Explicación : {start..end..step}. El -fmensaje para ignorar en archivos inexistentes.


Ps Para mantener la seguridad y verificar qué archivos se eliminarán, primero realice una prueba con:

ls -1 rho_{0..200000..5000}.txt
αғsнιη
fuente
13

rmno lee de la entrada estándar. Podrías hacerlo:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

Incluyo la -iopción de rmsolicitar antes de la eliminación para que pueda verificar el comportamiento. Una vez que esté seguro de que está haciendo lo que quiere, puede omitir esa opción.

Editar: Alternativamente, puedes hacer:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

Esa forma puede ser más familiar si ha realizado alguna programación.

Andy Dalton
fuente
12

No puede canalizar a un programa como si el contenido de la canalización fuera argumentos. Se envía a través de stdin.

Debe usar xarg para este propósito:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

pero primero puedes probar con echo para ver si todo está como pretendes:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
M4rty
fuente
Si su versión de seqtiene la opción -f/ --format, puede usarla en lugar de esta solución con la printfsustitución de comandos.
David Foerster
Gracias, acabo de responder usando el comando utilizado en la pregunta y tratando de explicar su error rm
M4rty
9

Alguien me corrige si me equivoco, pero si todos los archivos que comienzan rho_son de esta forma, ¿no es equivalente a hacerlo?

rm rho_0.txt rho_*[05]000.txt

Dado que un número (que no sea 0) es un múltiplo de 5000 si y solo si termina en 0000 o 5000.

(0 es un caso especial, ya que es un múltiplo de 5000, pero generalmente se escribe sin ceros a la izquierda adicionales. Si no pretendía incluir 0, quítelo de la línea anterior).

Por supuesto, esto solo debe usarse si todos los rho_*.txtarchivos en su directorio tienen la forma deseada. No lo use si su directorio también contiene rho_please_dont_delete_me_5000.txt.

(Nota matemática: esto funciona precisamente porque todos los factores primos de 5000, es decir, 2 y 5, también son factores primos de la base en la que estamos trabajando, 10. Equivalentemente, hay una potencia suficientemente grande de 10 (es decir, 10000) que es divisible por 5000. No hay un truco similar para hacer coincidir todos aquellos que son múltiplos de 3000.)

Nate Eldredge
fuente
Esta es realmente la mejor respuesta.
cesarv