Bash renomeia 360.000 arquivos usando find -exec

Bash renomeia 360.000 arquivos usando find -exec

Eu tenho cerca de 360.000 arquivos como:

./001/1/1.jpg
./001/1/2.jpg
./001/2/1.jpg
./002/1/1.jpg
./003/1/1.jpg
...
pattern: [60 dirs]/[1000 subdirs]/[4-10 files].jpg

Quero renomear arquivos usando, renamepor exemplo, de *.jpg para *.jpeg. Não posso fazer isso single rename, porque a lista de argumentos de erro é muito longa.

Procurando por solução, descobri isso, mas não renomeia nada:

find -maxdepth 2 -mindepth 2 -type d -exec rename -n 's/jpg/jpeg/' {}/* \;

Quando verifico se {}está expandido substituindo renomear por echo:

find -maxdepth 2 -mindepth 2 -type d -exec echo "rename -n 's/jpg/jpeg/' {}/*" \;

Eu recebo o resultado esperado:

rename -n 's/jpg/jpeg/' ./061/61430/*
rename -n 's/jpg/jpeg/' ./061/61431/*
...

Se eu executar qualquer um desses comandos de renomeação, renomeio obras. Portanto, deve haver problema com o arquivo {}.

Obrigado pela ajuda!

Responder1

Na primeira instância, *é expandido pelo shell antes de chegar rename(se for expandido - duvido que algo corresponda ) {}/*e, se não for expandido, o comando executado é renamecom os três argumentos -ne . Esse último argumento não é o nome de um arquivo existente, portanto não faz nada.s/jpg/jpeg/some/path/*rename

Sem globbing de shell, o caminho é inútil para rename.

Então, em vez disso, faça:

find -maxdepth 3 -mindepth 3 -type f -iname '*.jpg' -exec rename -n 's/jpg$/jpeg/i' {} +

Use finda capacidade de construir linhas de comando o maior tempo possível com +em vez de ;.

Responder2

find  | prename 's/\.jpg$/.jpeg/'

ou se você tiver arquivos oder no diretório atual

find 0[0-9][0-9] | prename 's/\.jpg$/.jpeg/'

Responder3

Você não deve especificar, type da menos que queira renomear apenas diretórios. Para alterar as extensões .jpgpara .jpegtentar

find . -maxdepth 2 -mindepth 2 -name '*.jpg' -exec sh -c 'echo mv -- "$0" "${0%%.jpg}.jpeg"' {} \;

Remova echose gostar do que vê na tela.

Responder4

Usando o cygwin, minha versão de renomear não possui a substituição de regex, nem sua rename [options] expression replacement file...sintaxe parece funcionar. Além disso, as sugestões do bash falham com

... -c: line 0: unexpected EOF while looking for matching `"'
... -c: line 1: syntax error: unexpected end of file

Infelizmente... sempre há perl:

perl -MFile::Find -e 'find(sub{return unless /^(.*)\.jpg$/;`mv $_ $1.jpeg`}, ".")'

informação relacionada