Renomear arquivos em vários diretórios com base em nomes de diretórios parciais

Renomear arquivos em vários diretórios com base em nomes de diretórios parciais

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]

informação relacionada