Um problema que você terá que enfrentar ao renomear arquivos em diretórios de forma recursiva é separar o nome do arquivo (que você deseja modificar) do caminho. Você não pode simplesmente remover o componente do caminho, porque seus arquivos acabarão sendo movidos em vez de simplesmente renomeados.
Para usar seu método original, acho que você precisa fazer algo como
while read -r -d '' f; do
file="${f##*/}"; path="${f%/*}"
echo mv -- "$path/$file" "$path/${file:0:2}"."${file:2}"
done < <(find -type f -iname "*.wav" -print0)
Outra opção é usar o find
do comando -execdir
em vez de -exec
. Eu penso que é seguro assumir que os resultados serão apresentados ao seu comando rename (se você usa rename
ou mv
) com apenas um ./
como o caminho, nesse caso você pode fazer
find -type f -iname "*.wav" -execdir rename -nv -- 's|\./..|$&.|' {} +
ou usando uma variante mais perl-ish
find -type f -iname "*.wav" -execdir rename -nv -- 's|\./..\K|.|' {} +
ou usando algo mais equivalente à sua abordagem mv
original
find -type f -iname "*.wav" -execdir bash -c 'echo mv -- "$0" "${0:0:4}"."${0:4}"' {} \;
(note que os índices de substring foram aumentados em 2 para permitir o componente% path ./
).
Se a sua versão de find
não tiver a opção -execdir
, você poderá modificar a rename
regex para pular o prefixo de caminho correspondente mais longo, por exemplo,
find -type f -iname "*.wav" -exec rename -nv -- 's|.*/..\K|.|' {} +
Nota: todas essas expressões têm opções "no-op" (renomear a opção -n
ou um comando echo
) para que você possa verificar o que faria antes de confirmar .