mv: adicione o número ao nome do arquivo se o destino existir

2

Estou movendo um arquivo para uma pasta diferente e gostaria de adicionar algum tipo de índice ao arquivo recém-movido se já existir um arquivo com o mesmo nome (o antigo deve permanecer intacto).

Aqui Encontrei uma variante para a ideia oposta - mas não sei quer fazer um "backup".

O mv tem alguns parâmetros prontos para esse cenário? Eu uso o Ubuntu Linux.

    
por Qohelet 15.06.2017 / 20:55

2 respostas

3

Como a resposta à pergunta que você vinculou já declara, mv pode sufocar arquivos que, de outra forma, seriam substituídos pelo arquivo movido por um número para fornecer um nome de arquivo exclusivo:

mv --backup=t <source_file> <dest_file>

O comando funciona anexando o próximo sufixo de número não usado ao arquivo que foi o primeiro no diretório de destino. O arquivo que você está movendo manterá seu nome original.

No entanto, isso adicionará sufixos como .~1~ , o que parece não ser o que você deseja:

$ ls
file.pdf
file.pdf.~1~
file.pdf.~2~

Você pode renomear esses arquivos em uma segunda etapa para obter os nomes em um formato como file_1.pdf em vez de file.pdf.~1~ , por exemplo, assim:

rename 's/((?:\..+)?)\.~(\d+)~$/_$2$1/' *.~*~

Isso leva todos os arquivos que terminam com o sufixo de backup indesejado (correspondendo ao shell glob *.~*~ ) e permite que a ferramenta rename tente corresponder à expressão regular ((?:\..+)?)\.~(\d+)~$ no nome do arquivo. Se isso corresponder, ele capturará o índice do sufixo .~1~ -like como segundo grupo ( $2 ) e, opcionalmente, se o nome do arquivo tiver uma extensão antes desse sufixo como .pdf , isso será capturado pelo primeiro Código de grupo%). Em seguida, ele substitui a parte completa do nome do arquivo correspondente por $1 , inserindo os valores capturados em vez dos marcadores de posição.

Basicamente, ele será renomeado _$2$1 a file.pdf.~1~ e file_1.pdf a something.~42~ , mas não é possível detectar se um arquivo tem várias extensões, por exemplo, something_42 se tornaria archive.tar.gz.~5~

    
por 15.06.2017 / 22:31
0

Ok, não me julgue por minhas habilidades ruins, mas essa solução funcionou para mim. (Apreciei solução Byte Commanders , mas é devido a suas restrições, não o que eu estava procurando)

Então aqui está meu pequeno roteiro que faz o trabalho ...

  • $2 é o caminho
  • $3 o nome do arquivo
  • $punktpdf é apenas ".pdf"

Então aqui está meu pequeno roteiro ...

if [ -s $2$3$punktpdf ]; then
    for i in 'seq 1 100000';
        do
            if [ ! -s $2$3$i$punktpdf ]; then
                if mv scan.pdf $2$3$i$punktpdf; then                        
                    echo $3$i$punktpdf
                    exit 0
                    break
               else                        
                    echo 1
                    break
               fi
           fi
        done
    else
        #Regular mv
    fi
    
por 16.06.2017 / 22:44

Tags