Tenho muitos diretórios em um local com arquivos de várias extensões. Os diretórios seguem uma convenção padrão, mas os arquivos contidos neles não. A solução que estou tentando encontrar é renomear os arquivos dentro de cada pasta com base em uma parte do diretório em que estão localizados para a lista de pastas que preciso percorrer.
Por exemplo:
Diretório: 001234@Redsox#17
file1.pdf
file7A.doc
spreadsheet.xls
Saída:
[email protected]
[email protected]
[email protected]
Seguindo com cada diretório, renomeando apenas o código anexado ao nome do diretório. Já tenho uma estrutura básica para operar no processo, mas não tenho certeza da melhor forma de obter a parte do diretório necessária
for directory in *; do
pushd "$directory"
index=1
for filename in *; do
target_filename="${directory}$????${filename}"
mv "$filename" "${target_filename}"
((index++))
done
popd
done
Responder1
Eu faria algo assim:
# 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]