Renomear recursivo para remover o final de vários nomes de arquivos em uma pasta

1

Gostaria de renomear vários arquivos em uma pasta.

Estou procurando manter todos os nomes de arquivo originais menos a tag no final.

por exemplo eu tenho:

FILE1[file].doc

FILE2[file].doc

FILE3[file].doc

etc

Eu quero remover [file] de todos os arquivos na pasta de forma recursiva, e gostaria de fazê-lo a partir da linha de comando.

Qualquer ajuda seria muito apreciada.

    
por John Blaze 25.01.2017 / 18:38

2 respostas

2

Eu assumo que seu diretório de trabalho atual é o que contém os arquivos que você deseja renomear, como neste exemplo:

$ tree

.
├── FILE1[file].doc
├── FILE2[file].doc
├── FILE3[file].doc
└── subdir
    ├── FILE1[file].doc
    ├── FILE2[file].doc
    └── FILE3[file].doc

Agora você pode executar o seguinte comando para listar recursivamente todos os arquivos no diretório atual com a extensão .doc :

$ find . -type f -iname '*.doc'

./subdir/FILE3[file].doc
./subdir/FILE2[file].doc
./subdir/FILE1[file].doc
./FILE3[file].doc
./FILE2[file].doc
./FILE1[file].doc

Para renomear todos esses arquivos e remover a parte [file] antes da extensão .doc (se estiver presente) de cada nome, execute este:

$ find . -type f -iname '*.doc' -exec rename -v 's/\[file\](?=\.doc$)//' {} +

./subdir/FILE3[file].doc renamed as ./subdir/FILE3.doc
./subdir/FILE2[file].doc renamed as ./subdir/FILE2.doc
./subdir/FILE1[file].doc renamed as ./subdir/FILE1.doc
./FILE3[file].doc renamed as ./FILE3.doc
./FILE2[file].doc renamed as ./FILE2.doc
./FILE1[file].doc renamed as ./FILE1.doc

Isso executa o comando rename -v 's/\[file\](?=\.doc$)//' FILES , em que FILES é substituído pela lista de arquivos retornados pelo comando find mostrado acima.

O que o rename 's/PATTERN/REPLACEMENT/' faz é aplicar o padrão de expressão regular \[file\](?=\.doc$) (corresponde à sequência exata "[arquivo]" se seguido pela sequência exata ".doc" no final da linha) para cada um dos nomes de arquivos especificados. Se corresponder, a parte correspondente do nome do arquivo será substituída pela string de substituição, que está vazia no nosso caso.

    
por Byte Commander 25.01.2017 / 19:04
0

abordagem Python, com re.split() e os.rename() .

$ ls
FILE1[file].doc  FILE2[file].doc  FILE3[file].doc
$ python -c "import os,re;[os.rename(f,'.'.join(re.split('\[|\]|\.',f)[::3])) for f in os.listdir('.')]"                 

$ ls
FILE1.doc  FILE2.doc  FILE3.doc

O que acontece aqui é que fazemos um loop sobre cada nome de arquivo no diretório de trabalho atual conforme fornecido pela função os.listdir() , use re.split() para dividir o nome do arquivo na lista de strings usando vários separadores, extrair a primeira e última cadeia e criar novo nome desses dois usando a função '.'.join() . O resto é simplesmente os.rename(old,new)

Observe que essa é uma abordagem simples e não protege contra a renomeação de diretórios ou outros arquivos dispersos que você possa ter nessa pasta.

    
por Sergiy Kolodyazhnyy 25.01.2017 / 20:59