Removendo parte de todo o nome do arquivo em uma pasta?

1

Minha câmera armazena fotos no seguinte formato:

DSC_0001 (2015_07_30 10_34_56 UTC).NEF

Com o número após a iteração DSC_ e os colchetes especificando a hora e a data, no entanto, todas as informações de data e hora estão nos metadados, portanto, estou procurando renomear todos os arquivos produzidos:

DSC_0001.NEF etc

Eu olhei para o comando rename no bash, mas não consigo entender como fazê-lo fazer o que eu quero, estou querendo mudar todos os arquivos em uma pasta.

Se você pudesse explicar por que o que você sugere funciona, eu ficaria muito grato por poder tentar aprender como resolver problemas semelhantes no futuro.

NOTA: estou usando o Bash, se isso faz diferença.

    
por SamRob85 08.07.2018 / 16:14

4 respostas

2

Com a ferramenta de renomeação Perl:

rename 's/ \(.*?\)//' *.NEF

O regex deve ser simples ( .*? corresponde à string mais curta).

Difícil ver Por que o utilitário rename no Debian / Ubuntu é diferente daquele em outras distribuições, como o CentOS? sobre os dois diferentes comandos rename .

    
por 08.07.2018 / 16:34
1

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:

por 08.07.2018 / 16:28
1

Se houver um par de parênteses espaço ( ( ) em todos os nomes de arquivos (e não no caminho), você poderá usar:

mv "$f" "${f%% (*}.NEF"

Para repetir todos os arquivos:

$ for f in dir/*\(*\).NEF; do [ -f "$f" ] && mv "$f" "${f%% (*}.NEF"; done
    
por 08.07.2018 / 16:29
0

Você precisa estar no diretório onde os arquivos estão

let a=0; for i in *.NEF; do let a=a+1; b='basename $PWD'; c='printf %04d$b.NEF $a'; mv $i $c; done

Para renomear tudo ao mesmo tempo.

    
por 09.07.2018 / 01:42