Substituição incorreta ao renomear arquivos usando find

1

Estou tentando renomear recursivamente arquivos de imagem usando o comando find .

Atualmente, o comando é escrito da seguinte forma:

$ find . -name '*.jpg' -exec rename "${echo $(uuidgen) | cut -c1-8}.jpg" '{}' \;

E erros com:

bash: ${echo $(uuidgen) | cut -c1-8}.jpg: bad substitution

Eu tentei várias combinações de usar {} e () , mas nada parece funcionar. Se eu executar echo $(uuidgen) | cut -c1-8 por conta própria, o resultado correto é produzido, então eu só quero simplesmente interpolar essa String no nome da imagem.

Se eu realizar a substituição da seguinte forma:

$ find . -name '*.jpg' -exec rename "$(echo $(uuidgen) | cut -c1-8).jpg" '{}' \;

Os erros de comando com:

Bareword "jpg" not allowed while "strict subs" in use at (eval 1) line 1.

Como posso corrigir esses problemas?

Obrigado pela sua ajuda!

    
por James Taylor 06.12.2015 / 23:06

2 respostas

2

De acordo com man rename :

SYNOPSIS

rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]

DESCRIPTION

"rename" renames the filenames supplied according to the rule specified as the first argument. The perlexpr argument is a Perl expression which is expected to modify the $_ string in Perl for at least some of the filenames specified. If a given filename is not modified by the expression, it will not be renamed. If no filenames are given on the command line, filenames will be read via standard input.

O primeiro argumento é, portanto, uma expressão regular. Você precisa alterar o primeiro argumento para um regex que corresponda a qualquer string e substituí-lo por: $(echo $(uuidgen) | cut -c1-8).jpg

find . -name '*.jpg' -exec rename 's/.*/$(echo $(uuidgen) | cut -c1-8).jpg/' '{}' \;
    
por 07.12.2015 / 08:52
0

Use apenas mv em vez de rename .

find . -name '*.jpg' -exec mv '{}' "$(echo $(uuidgen) | cut -c1-8).jpg"  \;
    
por 07.12.2015 / 08:19