Actualice los nombres de los archivos en un solo directorio con el prefijo más la letra

1

He encontrado numerosos métodos para agregar un prefijo simple a los archivos en una carpeta en Linux, por ejemplo.

for FILENAME in *; do mv $FILENAME REF_$FILENAME; done 

( https://stackoverflow.com/questions/4787413/rename-files-and-directories-add-prefix )

Me gustaría hacer esto pero con el cambio de REF para cada archivo a REFa, REFb, REFc, ... Esto se ejecutaría manualmente en un solo directorio porque el REF sería diferente para cada uno.

Gracias de antemano porque el ganador literalmente me ahorrará horas de entrada manual de datos ;-)

Matthew
fuente
1
¿Puedes usar números en lugar de letras? Eso haría que el problema sea mucho más fácil de resolver. Además, lo está utilizando para realizar pedidos (en cuyo caso querríamos rellenarlo)
davidgo

Respuestas:

0

La respuesta rápida y sucia sería la siguiente:

array=(`echo {a..z}{a..z}{a..z}`);i=0; for FILENAME in *; do  mv $FILENAME REF${array[i]}_$FILENAME; i=$(($i+1)); done

Pero prefiero hacerlo como un script que luego puede ejecutar, es más fácil de mantener y describir.

array=(`echo {a..z}{a..z}{a..z}`)
i=0 
for FILENAME in *
do 
    mv $FILENAME REF${array[i]}_$FILENAME 
    i=$(($i+1)) 
done

La primera línea carga una secuencia de letras de 3 dígitos, comenzando aaa, y descendiendo a zzz. Puede reducir o aumentar el tamaño de esta matriz aumentando o disminuyendo el número de {a..z}, y puede reemplazarlo con letras mayúsculas o alguna otra secuencia simple.

i es un contador que incrementamos para que podamos obtener una secuencia única para cada valor de REF.

Observo que no me gusta el bit de código "NOMBRE DE ARCHIVO en *", porque no funciona bien con los subdirectorios. Me inclino a reemplazar esa línea con

for FILENAME in `find . -type f`

para manejar archivos, incluyendo subdirectorios, o

for FILENAME in `find . -maxdepth 1 -type f`

para archivos solo en el directorio actual (es decir, no lo recursivo, e ignorar directorios)

davidgo
fuente
0

Podría crear un comando adaptado a este problema específico, estoy seguro de que otras respuestas lo harán. Mi respuesta es mas general , tal vez te quede bien.

vidir (muy probablemente de moreutils paquete) le permite editar los nombres de archivos en un editor de texto. Para elegir un editor configura el EDITOR variable.

De esta manera puedes usar muchas características de vi, emacs o cualquier editor que uses. Leer man vidir para aprender cómo hacerlo funcionar con subdirectorios si lo necesita.

Este es un ejemplo de cómo se vería en tu editor:

1   ./AdbeRdr9.5.5-1_i486linux_enu.bin
2   ./AdobeAIRInstaller.bin
3   ./Dir1
4   ./Dir10
5   ./Dir2
6   ./bashfile.sh

Los números identifican archivos en esta instancia particular de vidir, les siguen las pestañas. No puede tocar estos números y pestañas a menos que sepa lo que está haciendo. Los cambios en los nombres de archivo se aplican cuando guarda el texto.

Si tienes miedo, hay un nombre de archivo con pestaña o un carácter de nueva línea en algún lugar y esto romperá algo, entonces mantén la calma. Por lo que sé vidir Se negará a trabajar con él en primer lugar.

Ahora la mejor parte. El editor también puede funcionar fuera de la consola, por lo que es posible:

  1. Invocar EDITOR=kate vidir, esto funcionará kate editor.
  2. Copia todo el texto y pégalo en LibreOffice Calc; obtendrá dos columnas.
  3. Manipule los nombres utilizando las herramientas proporcionadas por Calc para obtener el resultado en dos columnas: números y nuevo nombres
  4. Copia estas dos columnas de nuevo a kate y reemplazar el texto antiguo.
  5. Guarde el archivo de texto.

Esto es muy poderoso. Eliminar líneas y guardar el archivo de texto eliminará los archivos. Los números de intercambio harán que los archivos intercambien nombres (o incluso rutas si trabaja con subdirectorios). Con un gran poder viene una gran responsabilidad. Probablemente debería experimentar primero con archivos y directorios fungibles.

Kamil Maciorowski
fuente