Como renomear arquivos em um diretório como o seguinte arquivo PMC21375.pdf.txt
:, preciso renomear 21375.txt
. ou seja, preciso remover os dois PMC
e pdf
de cada nome de arquivo.
Como renomear arquivos em um diretório como o seguinte arquivo PMC21375.pdf.txt
:, preciso renomear 21375.txt
. ou seja, preciso remover os dois PMC
e pdf
de cada nome de arquivo.
Respostas:
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 shell
prompt. É muito útil, você pode colocar algum código perl 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.
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) Debian
e derivado como Ubuntu
:
$ sudo update-alternatives --set rename /path/to/rename
(substitua /path/to/rename
pelo caminho do seu perl's rename
comando.
Por último, mas não menos importante, essa ferramenta foi originalmente escrita por Larry Wall, o pai do Perl.
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
.pdf
o nome do arquivo.
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 *txt
limitar a substituição aos arquivos de texto.
rename
já 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.
rename
. Há um util-linux
e outro perl
com sintaxe diferente. O que você está se referindo se parece com o do util-linux
às vezes chamado rename.ul
para não confundir com o rename
do perl
, enquanto em outros sistemas rename
é o do util-linux e o do perl
é chamado prename
.
rename 's/PMC// *.txt
e #rename s/\.pdf// *.txt
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 .pdf
e novamente:
python -c "import glob,os; [os.rename(fn, fn.replace('PMC', '')) for fn in glob.glob('*')]"
remover PMC
.
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 .pdf
em $i
com nada. Da mesma forma, com a segunda tarefa j se livrando do PMC.
Se você estiver usando zsh
, esse é um trabalho típico para zmv
:
zmv 'PMC(*).pdf.txt' '$1.txt'
( zmv
lida com possíveis conflitos normalmente).
.pdf
nome do arquivo.