¿Cambiar el nombre del archivo (prefijo) con la ruta completa?

¿Cambiar el nombre del archivo (prefijo) con la ruta completa?

Me gustaría poner un prefijo a mis archivos ( .dat) de esta manera:

CLY_BIZ_COM_PERD.dat -> 20160622CLY_BIZ_COM_PERD.dat

He probado lo siguiente:

key=`date "+%Y%m%d"`
for i in $(ls /Path/*.dat); do mv ${i} "${key}${i}" ;done

Pero este comandosufijomis archivos y no anteponerlo. ¿Cómo puedo hacer esto?

Respuesta1

Dos cambios en su script actual:

  1. noanalizar ls;en lugar de confiaren el globo del caparazón

  2. debido a que los archivos están en un subdirectorio, primero cdallí y ejecute el bucle, o use basenamey dirnamepara extraer las partes del directorio y el nombre del archivo antes de agregar el prefijo.

(Nota: también cambié su "/Path" a "./Path" porque no quería crear un directorio /Path de nivel raíz. Sin embargo, se aplican los mismos principios.

Para configurar algunos archivos de muestra:

mkdir Path && cd Path
touch CLY_BIZ_COM_PERD.dat jeff.dat a.dat c\ d.dat
cd ..

Aquí hay un ensayo:

for f in ./Path/*.dat
do 
  printf "mv '%s' '%s'\n" "$f" "$(dirname "$f")/${key}$(basename "$f")"
done

Resultado del simulacro:

mv './Path/a.dat' './Path/20160622a.dat'
mv './Path/c d.dat' './Path/20160622c d.dat'
mv './Path/CLY_BIZ_COM_PERD.dat' './Path/20160622CLY_BIZ_COM_PERD.dat'
mv './Path/jeff.dat' './Path/20160622jeff.dat'

Una vez que estés satisfecho, hazlo de verdad:

for f in ./Path/*.dat
do 
  mv "$f" "$(dirname "$f")/${key}$(basename "$f")"
done

... y el resultado:

$ ls -1 Path
20160622a.dat
20160622c d.dat
20160622CLY_BIZ_COM_PERD.dat
20160622jeff.dat

información relacionada