Cópia em lote e renomear com regexp

4

Eu estou querendo saber se existe uma maneira de copiar e renomear um monte de arquivos sem script. Eu tenho arquivos com nomes como prefix_12345678901_12345678901_suffix.ext e eu preciso copiar todos eles em um determinado diretório de modo que as cópias sejam nomeadas como 1234567890_1234567890.ext

Eu também não quero sobrescrever arquivos existentes no diretório de destino.

Eu sei que posso fazer algo como:

cp -n source/*.ext target

seguido por

rename 's/.*([0-9]{11}_[0-9]{11}).*\.(.*$)/$1.$2/' *.ext

mas isso faria cópias primeiro e só então descobrir se os arquivos já existem ou não. Eu preciso de um processo inverso ...

EDITAR:

Bem, acho que isso é script, mas finalmente consegui algo como:

for i in /source/*.ext; do if [[ "$i" =~ [0-9]{11}_[0-9]{11} ]]; then cp $i /target/${BASH_REMATCH[0]}.ext; fi done;
    
por Petr 12.05.2011 / 19:24

1 resposta

4

pax pode copiar e renomear tudo de uma vez.

pax -rw -pp -k \
    -s'!^source/[^/]*\([0-9]\{11\}_[0-9]\{11\}\)[^/]*\(\.[^./]*\)!!' \
    -s'!.*!!' source target

pax -rw copia arquivos; -pp preserva as permissões e -k diz para não sobrescrever os arquivos existentes. Os argumentos -s dizem ao pax para renomear os arquivos enquanto estão copiando. A primeira transformação faz a renomeação desejada (usando expressões regulares básicas e substituções como em ed . A segunda transformação transforma todos os nomes de arquivos de origem que ainda não foram correspondidos na string vazia, o que informa ao pax para não copiar o arquivo.

Nota para os fãs do zsh: até onde eu sei, você não pode obter zmv para copiar os arquivos onde a definição não existe e deixar os outros em paz.

    
por 12.05.2011 / 23:00

Tags