Renomeando arquivos de acordo com um número de caracteres do nome do diretório

3

Eu tenho vários diretórios como estes:

./lab-results.n3668.2017-01-16
./lab-results.n471.2017-02-24
./tests.n287.2017-01-28
./tests.n4501.2017-03-04

Eles contêm infelizmente apenas um arquivo , mas o nome é o mesmo.

./lab-results.n3668.2017-01-16/lab-results.pdf
./lab-results.n471.2017-02-24/lab-results.pdf
./tests.n287.2017-01-28/tests.pdf
./tests.n4501.2017-03-04/tests.pdf

Gostaria de mover todos esses arquivos depois de renomeá-los assim:

./lab-results.n3668.pdf
./lab-results.n471.pdf
./tests.n287.pdf
./tests.n4501.pdf

Então, parece que alguns scripts sh eu vejo lá, mas não consigo descobrir como Eu posso pegar uma parte dos caracteres do nome do diretório para formar o nome futuro do arquivo.

lab-results.n9999 : max number available, will not change
tests.n9999 : max number

Eu também posso ter outros diretórios, mas sempre seguidos por um monte de números dentro de seus nomes:

./xxxxxxx.n9999
./yyyyyy.n9999
./zzz.n9999

Alguma dica ou ajuda muito apreciada. Eu uso bash 4.3.11 (1) em uma distribuição linux.

    
por Fanny Mae 03.05.2017 / 12:42

2 respostas

2
 for F in */* ; do echo mv "$F" "${F/.2017*/.pdf}" ; done

ou como um script:

#! /bin/bash
for F in */*
do
    echo mv "$F" "${F/.2017*/.pdf}"
done

Apenas mostra o que ele fará. Se for o que você deseja, remova echo e execute-o.

O truque é com ${F/.2017*/.pdf} . Ele procura .2017* no nome do arquivo + caminho e substitui por .pdf .

    
por 03.05.2017 / 12:59
1
rename 's|^(\./[^.]*\.[^.]*).*|$1.pdf|' ./*.*.*/*.pdf
  • Selecionamos diretórios com pelo menos dois pontos e arquivos PDF.
  • Em seguida, mantemos as informações até os dois primeiros pontos e construímos o novo nome de arquivo.
  • Isso pressupõe que rename seja perl-rename . Os sistemas baseados em Debian têm perl-rename como rename , outros podem tê-lo como perl-rename ou prename .
por 03.05.2017 / 13:39

Tags