Tengo folderA
algunos 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_000750
hasta 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í, find
simplemente enumera todos los archivos que coinciden a_*
. La lista se pasa a un while
bucle 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 000750
o mayor, el archivo se elimina. Está -v
ahí 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 201
viene antes 31
lexicográficamente, no lo hace antes 031
.
Pruebe esto con el echo
comando y, una vez que esté seguro de que enumera los archivos correctos, utilícelo rm
en 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