Renomear arquivos no diretório

10

Como renomear arquivos em um diretório como o seguinte arquivo PMC21375.pdf.txt:, preciso renomear 21375.txt. ou seja, preciso remover os dois PMCe pdfde cada nome de arquivo.

kylejudita
fonte

Respostas:

9

Com 's rename:

rename 's/(PMC|\.pdf)//g' *pdf.txt 

Demo:

$ ls *txt
PMC21375.pdf.txt
$ rename -n 's/(PMC|\.pdf)//g' *txt 
PMC21375.pdf.txt -> 21375.txt

a partir do shellprompt. É muito útil, você pode colocar algum código como eu faço em uma substituição.

Você pode remover o -n(interruptor do modo de funcionamento a seco) quando seus testes se tornarem válidos.

Atenção Existem outras ferramentas com o mesmo nome que podem ou não conseguir fazer isso, portanto, tenha cuidado.

Se você executar o seguinte comando ( linux)

$ file $(readlink -f $(type -p rename))

e você tem um resultado como

.../rename: Perl script, ASCII text executable

então esta parece ser a ferramenta correta =)

Caso contrário, para torná-lo o padrão (geralmente já é o caso) Debiane derivado como Ubuntu:

$ sudo update-alternatives --set rename /path/to/rename

(substitua /path/to/renamepelo caminho do seu perl's renamecomando.


Por último, mas não menos importante, essa ferramenta foi originalmente escrita por Larry Wall, o pai do Perl.

Gilles Quenot
fonte
Isso não removerá o .pdfnome do arquivo.
22813 William Everett
Postagem editada de acordo.
Gilles Quenot
5

Além do comando rename, você pode fazê-lo diretamente no bash (apenas uma maneira de várias):

 for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done

Editado para mostrar a Pinyaka como funciona:

hmontoliu@ulises2:/tmp/foo$ touch PCM21375.pdf.txt PCM21376.pdf.txt
hmontoliu@ulises2:/tmp/foo$ ls
   PCM21375.pdf.txt  PCM21376.pdf.txt
hmontoliu@ulises2:/tmp/foo$ for file in *pdf.txt; do mv $file ${file//[A-Z.]}.txt ; done
hmontoliu@ulises2:/tmp/foo$ ls
   21375.txt  21376.txt
hmontoliu
fonte
Isso não removerá .pdfo nome do arquivo.
William Everett
tentaste? porque para mim faz. Mostrado na edição.
hmontoliu
Foi mal. Eu pensei que seria apenas converter letras maiúsculas. Votado.
William Everett
4

Existem vários utilitários para renomear arquivos, mas um dos mais fáceis de usar é rename. No seu caso, você provavelmente pode:

rename PMC '' *txt
rename .pdf '' *txt

O primeiro parâmetro é a parte do nome do arquivo a ser substituído. O segundo parâmetro é a sequência de substituição. Aqui estou usando ''para representar a string vazia. Todos os parâmetros a seguir são arquivos para renomear, aqui eu costumava *txtlimitar a substituição aos arquivos de texto.

renamejá deve estar presente se você estiver executando o Linux. Se você estiver executando um * BSD ou OS X, talvez seja necessário instalá-lo primeiro.

wingedsubmariner
fonte
Eu não acho que exista um GNU rename. Há um util-linuxe outro perlcom sintaxe diferente. O que você está se referindo se parece com o do util-linuxàs vezes chamado rename.ulpara não confundir com o renamedo perl, enquanto em outros sistemas renameé o do util-linux e o do perlé chamado prename.
Stéphane Chazelas
1
O meu é o do util-linux. Por engano, pensei que fazia parte dos coreutils do GNU.
wingedsubmariner
A versão padrão do Debian para renomear seria algo como isto rename 's/PMC// *.txte #rename s/\.pdf// *.txt
William Everett
1

Primeiro faça um backup dos seus arquivos! Basicamente, você pode usar um liner python no diretório atual com o formato geral:

python -c "import glob,os; [os.rename(fn, fn.replace('PATTERN', 'REPLACE')) for fn in glob.glob('PATH/*')]"

no seu caso específico, você pode usar isso duas vezes:

python -c "import glob,os; [os.rename(fn, fn.replace('.pdf', '')) for fn in glob.glob('*')]"

para remover .pdfe novamente:

python -c "import glob,os; [os.rename(fn, fn.replace('PMC', '')) for fn in glob.glob('*')]"

remover PMC.

xaratustra
fonte
0

Tente o seguinte:

for i in *.pdf.txt; do j=${i//\.pdf/}; j=${j//PMC/}; mv $i $j; done

Os j=${i//\.pdf/}meios para substituir .pdfem $icom nada. Da mesma forma, com a segunda tarefa j se livrando do PMC.

William Everett
fonte
0

Se você estiver usando zsh, esse é um trabalho típico para zmv:

zmv 'PMC(*).pdf.txt' '$1.txt'

( zmvlida com possíveis conflitos normalmente).

Stéphane Chazelas
fonte