¿Cómo puedo eliminar archivos numerados en un rango determinado?

¿Cómo puedo eliminar archivos numerados en un rango determinado?

Tengo folderAalgunos archivos con una secuencia numérica que comienza con a_000000. Lo que quiero hacer es eliminar archivos a partir de un número específico: digamos a_000750hasta el final de los archivos en este archivo folderA. ¿Alguien podría aconsejarnos cómo hacer esto usando un script de Shell?

Respuesta1

Suponiendo que conozca o pueda adivinar el final del rango, podría utilizarexpansiones de tirantes:

rm a_{000750..000850}

Lo anterior eliminará los 101 archivos entre a_000750 y a_000850 inclusive (y quejará sobre nombres de archivos que se refieren a archivos no existentes). Si tiene demasiados archivos para eso, use find:

find . -name 'a_*' | while read -r file; do 
  [ "${file#./a_}" -gt 000749 ] && rm -v "$file" 
done

Aquí, findsimplemente enumera todos los archivos que coinciden a_*. La lista se pasa a un whilebucle donde cada nombre de archivo se lee en la variable $file. Luego, usando bashmanipulación de cuerdascaracterísticas, si la parte numérica (buscar imprime archivos como ./file, por lo que ${file#./a_}imprime solo el número) es 000750o mayor, el archivo se elimina. Está -vahí para que pueda ver qué archivos se eliminaron.

Tenga en cuenta que lo anterior supone nombres de archivos correctos. Si sus nombres pueden tener espacios, nuevas líneas u otros caracteres extraños, utilice esto en su lugar:

find . -name 'a_*' -print0 | while IFS= read -rd '' file; do 
  [ "${file#./a_}" -gt 000749 ] && rm -v "$file" 
done

Respuesta2

Podrías hacer algo como esto:

find . -regextype posix-extended -iregex './a_[0-9]{6}' -execdir bash -c '[[ ${1##./a_} > 000750 ]] && echo $1' "removing: " {} \;

O:

find . -regextype posix-extended -iregex './a_[0-9]{6}' | sort | sed '0,/000750/d' | xargs echo

El primer método supone un prefijo fijo, lo elimina y comprueba el valor.

El segundo método supone un sufijo de longitud fija (y un prefijo fijo común) y se basa en ese hecho; y que, si bien 201viene antes 31lexicográficamente, no lo hace antes 031.

Pruebe esto con el echocomando y, una vez que esté seguro de que enumera los archivos correctos, utilícelo rmen su lugar.

Respuesta3

En Bash puedes ejecutar:

for i in {1001..3000} ; do rm file_"$i".dat ; done

Respuesta4

Tan simple como

rm partialfilename* -f

En tu ejemplo es

rm a_00075* -f

información relacionada