Se os arquivos sempre tiverem um nível de diretório profundo, você poderá iterar sobre eles com algo como for x in */*_20*_*
. Qual padrão usar depende de quais outros arquivos podem estar presentes que você não deseja renomear. O padrão que acabei de dar pressupõe que a data começa com 20
e que todos os arquivos cujo nome contenha _20
e outra descontinuação depois disso devem ser renomeados.
Você pode renomear com um loop de shell, usando expansão de parâmetro constrói para construir o novo nome de arquivo.
for old_name in ./*/*_20_*_*; do
base=${old_name##*/} # remove the directory part
prefix=${base%%_20*} # remove everything from _20
suffix=${base#*_20} # remove everything up to _20
suffix=${suffix#*_} # ... then everything before the first remaining _
mv "$old_name" "${old_name%/*}/${prefix}_${suffix}"
done
Se os arquivos estiverem em profundidades variadas, no bash ≥4.3, você poderá executar shopt -s globstar
, em seguida, for x in **/*_20*_*; …
. O padrão **
corresponde a qualquer profundidade de diretório se globstar
estiver ativado . Isso também funciona no bash 4.0–4.2 com a ressalva de que ele também percorre links simbólicos para diretórios. Isso também funciona em zsh e ksh, sem a ressalva, fora da caixa em zsh e com set -o globstar
em ksh.