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]