Se os arquivos estiverem em uma pasta única sem subdiretórios, e essa pasta chamada photos
:
for pathname in photos/*(*).NEF; do
newname=${pathname##*/}
newname=${newname%% '('*}.NEF
printf 'Would move "%s" to "%s"\n' "$pathname" "${pathname%/*}/$newname"
# mv -i "$pathname" "${pathname%/*}/$newname"
done
Isso iteraria todos os nomes de arquivos em photos
cujos nomes continham (
e terminavam em ).NEF
. Um novo nome de arquivo é criado removendo o nome do diretório do nome do caminho atual e removendo tudo após ␣(
(espaço e (
) no que resta e adicione .NEF
no final do nome.
A renomeação real dos arquivos é comentada por segurança.
Exemplo de saída do código acima:
Would move "photos/DSC_0001 (2015_07_30 10_34_56 UTC).NEF" to "photos/DSC_0001.NEF"
Se os arquivos estiverem em algum lugar em uma estrutura de diretório maior:
find photos -type f -name '*(*).NEF' -exec sh -c '
for pathname do
newname=${pathname##*/}
newname=${newname%% \(*}.NEF
printf "Would move "%s" to "%s"\n" "$pathname" "${pathname%/*}/$newname"
# mv -i "$pathname" "${pathname%/*}/$newname"
done' sh {} +
A única diferença aqui é a maneira pela qual os nomes de caminho para os arquivos relevantes são gerados para o loop. Nesse caso, find
passará lotes de nomes de caminho encontrados para o loop, mas o próprio loop é o mesmo que estava no primeiro bit dessa resposta (com algumas pequenas modificações na cotação).
Relacionados: