Eliminar archivos específicos en la línea de comando

8

Tengo archivos fileName_1 , fileName_2 ... fileName_100000 donde los fileNames están numerados secuencialmente. ¿Cómo puedo eliminar los archivos de índice mayor que, digamos 100 ?

teaLeef
fuente

Respuestas:

17

Si los nombres de archivo están numerados secuencialmente, simplemente ejecute el siguiente comando:

rm fileName_{100..100000}
cioby23
fuente
3
Información: Esto funciona porque bash (su shell) expandirá el {x..y}a toda la lista. Por ejemplo, si lo usa echo test{1..3}, se expandirá echo test1 test2 test3y luego se ejecutará. Como puede ver, se imprime test1 test2 test3. Del mismo modo, si el {x..y}no está conectado a ningún argumento, solo pondrá los números allí. Por ejemplo echo test {1..3}, solo imprimirá test 1 2 3.
Luc
1
Nota: la execllamada impone un límite al número de argumentos que puede tener un proceso. Puedes recuperarlo con getconf ARG_MAX. Por ejemplo, en mi sistema es 2097152(~ 2.1 millones). Esto significa que rm(que no está integrado) fallará con más de esa cantidad de archivos. Los comandos integrados no tienen este problema, y ​​tampoco las otras soluciones propuestas.
Bakuriu
Tenga en cuenta que ARG_MAX es una cantidad de bytes, no una cantidad de argumentos. rm no puede manejar la eliminación de archivos 2097152 a la vez. Podría eliminar 2048 archivos, cada uno de los cuales tenía un nombre de 1023 bytes (no 1024; los delimitadores entre argumentos (\ 0 en C-land) cuentan para el límite).
Godlygeek
6

Puedes probar este comando también,

for i in $(seq 100 100000); do rm fileName_$i; done

Eliminará todos los archivos (rangos de 100 a 100000) si el nombre del archivo contiene números en orden secuencial.

Avinash Raj
fuente
5

En general, tiene varias formas de lograr esto:

rm fileName_{100..100000}

será expandido por el shell en aproximadamente 100,000 nombres de archivo. Si el nombre base es una ruta larga y el número es lo suficientemente alto, puede superar la longitud máxima de una línea de comando con este enfoque.

El forbucle

for i in $(seq 100 100000); do rm fileName_$i; done

no sufre este problema, pero es una forma relativamente lenta de eliminar los archivos, ya que el shell tiene que realizar la sustitución de variables y ejecutar rm aproximadamente 100,000 veces.

Ambos métodos anteriores pueden causar advertencias si filename_101faltan algunos de los archivos .

Por lo general, las soluciones basadas en findson mejores, ya que solo funcionan en archivos que realmente están allí (durante el descubrimiento). Sin embargo, hay algunas diferencias sutiles:

find . -name 'fileName_[100-100000]' -exec rm {} \;

se sigue en marcha el rmprograma de aproximadamente 100.000 veces, mientras que la sustitución de la final \;por +tratará de minimizar el número de subprocesos. Es probable que ambos métodos sean (mucho o un poco) más lentos que los -deleteque no utilizan comandos externos, sino que invocan llamadas del sistema.

Sin embargo, siempre verifique primero si el patrón realmente coincide con los archivos a los que desea apuntar:

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1

Entonces, en este caso, eliminaría un archivo que deseaba conservar y dejaría los archivos que deberían haberse eliminado.

Stefan Schmiedl
fuente
4

Use el siguiente comando:

find . -name 'fileName_[100-100000]' -exec rm {} \;

Eso eliminará archivos de 100 a 100000.

Más información: Sitio

nux
fuente
Sería mejor usarlo en +lugar de \;... mira aquí . O, mejor aún, use el -deletecomando find .
evilsoup
Probé esto, y solo eliminó fileName_1. La [100-100000] clase de caracteres solo coincide con un solo carácter, por lo que solo puede coincidir con 0 o 1.
deltab