Renomear arquivos em lote na pasta

10

Como retirar algum texto dos nomes de arquivos em uma pasta?

Atualmente, estou tentando:

rename s/"NEWER_(.*?)"//g *

Mas nada que seja renomeado

Eu tenho uma pasta pai, com um monte de subpastas, dentro de arquivos, que o OneDrive pensou que seria uma boa idéia anexar um "(NEWER_timestamp)" e gostaria de removê-lo.

Nomes de arquivo de exemplo:

getyou.ico (NEWER_1417529079.87)
o7pm.ico (NEWER_1417529184.89)
o7th.ico (NEWER_1417529135.81)
Kevin
fonte
2
Você pode postar um nome de arquivo de exemplo?
Muru
certo. pergunta atualizado com alguns
Kevin

Respostas:

8

Tente o seguinte:

find /path/to/parrent-dir -type f -exec rename -n 's:[^/]*(.*) .*$:$1:' {} +

./o7th.ico (NEWER_1417529135.81)                                 renamed as /o7th.ico
./sub-dir (NEWER_1417529135.81)/getyou.ico (NEWER_1417529079.87) renamed as /sub-dir (NEWER_1417529135.81)/getyou.ico
./sub-dir (NEWER_1417529135.81)/o7pm.ico (NEWER_1417529184.89)   renamed as /sub-dir (NEWER_1417529135.81)/o7pm.ico
./getyou.ico (NEWER_1417529079.87)                               renamed as /getyou.ico
./o7pm.ico (NEWER_1417529184.89)                                 renamed as /o7pm.ico
  • Tudo [^/]*(.*) .*$corresponde apenas à última parte do caminho que não contém a /. E
  • No regex acima, (.*)há um grupo de correspondência de tudo após o último /e antes de um espaço . Sua referência posterior será $1.
  • .*$corresponde a tudo no final $do nome dos arquivos após o espaço.
  • Finalmente, na parte de substituição da renomeação s/.../REPLACEMENT/, mantivemos o grupo correspondente entre o último \e um espaço (.*)conhecido como grupo de correspondências.
αғsнιη
fonte
2

Você deve considerar o uso de aspas fora da regex (no interior, elas são tomadas literalmente como aspas) e escapar (. Experimentar;

rename -n 's/ \(NEWER_\d{10}.\d{2}\)$//' *NEWER*

A precisão da expressão pode não ser necessária, mas você não pode ter muito cuidado ao modificar arquivos.

muru
fonte
tudo isso está fazendo é pendurado com reading filenames from STDINque já estou dentro da pasta pai, onde todos esses arquivos são
Kevin
@Kevin "Se nenhum nome de arquivo for fornecido na linha de comando, os nomes de arquivos serão lidos via entrada padrão." E como o shell deixa *NEWER*como está se nenhuma expansão for encontrada, você deve ter cometido um erro ou está usando um shell que substituiu um curinga incomparável por nada.
Muru
copiado e colado, no shell do Ubuntu 14.10
Kevin