Cambiar el nombre de archivos dentro de varios directorios según nombres de directorios parciales

Cambiar el nombre de archivos dentro de varios directorios según nombres de directorios parciales

Tengo muchos directorios en una ubicación con archivos de varias extensiones dentro de ellos. Los directorios siguen una convención estándar, pero los archivos que contienen no. La solución a la que estoy tratando de llegar es cambiar el nombre de los archivos dentro de cada carpeta según una parte del directorio en el que se encuentran para la lista de carpetas que tengo que revisar.

Por ejemplo:

Directorio: 001234@Redsox#17

file1.pdf
file7A.doc
spreadsheet.xls

Producción:

[email protected]
[email protected]
[email protected]

Continúe con cada directorio y cambie el nombre solo con el código agregado en el nombre del directorio. Ya tengo un marco básico para operar durante el proceso, pero no estoy seguro de cuál es la mejor manera de obtener la parte del directorio que necesito.

for directory in *; do 
    pushd "$directory"
    index=1
    for filename in *; do
        target_filename="${directory}$????${filename}"
        mv "$filename" "${target_filename}"
        ((index++))
   done
  popd
done

Respuesta1

Yo haría algo como esto:

# nullglob
#    If set, Bash allows filename patterns which match no files to
# expand to a null string, rather than themselves.
shopt -s nullglob

# instead of looping through the dirs, loop through the files
# add al the possible extensions in the list
$ for f in */*.{doc,pdf,xls,txt}; do 
  # get the file dirname
  d=$(dirname "$f")
                  # using parameter expansion get the part
                  # of the dirname you need
  echo mv -- "$f" "$d/${d%%@*}@$(basename "$f")"

  # when you are satisfied with the result, remove the `echo`
done
$ ls -1 001234@Redsox#17/
[email protected]
[email protected]
[email protected]

información relacionada