Como renomear todos os arquivos em um diretório para um formato específico? [duplicado]

0

Eu tenho um diretório no qual tenho muitos arquivos nesse formato apenas. Abaixo estão apenas exemplos para dois dos meus arquivos.

file_948_of_2000_push_data_12345.log
file_950_of_2000_push_data_12345.log

Como você pode ver, apenas a diferença é esse número de arquivo 948 e 950 . Agora quero renomear todos esses arquivos nesse formato específico, conforme mostrado abaixo:

files_948.log
files_950.log

Qual é a melhor maneira de fazer isso?

    
por user5447339 20.01.2017 / 22:03

2 respostas

2

Usando a expansão de parâmetros do shell

$ for f in *.log; do g="${f/#file_/}"; echo mv -- "$f" "files_${g%%_*}.log"; done
mv -- file_948_of_2000_push_data_12345.log files_948.log
mv -- file_950_of_2000_push_data_12345.log files_950.log

Usando o comando prename ou rename baseado em perl

$ prename -n -- 's/^(.*?)_(.*?)_.*\.log$/$1s_$2.log/' *.log
file_948_of_2000_push_data_12345.log renamed as files_948.log
file_950_of_2000_push_data_12345.log renamed as files_950.log

Usando mmv

$ mmv -n '*_*_*.log' '#1s_#2.log'
file_948_of_2000_push_data_12345.log -> files_948.log
file_950_of_2000_push_data_12345.log -> files_950.log

Remova o -n ou echo conforme apropriado.

    
por 21.01.2017 / 00:53
1

Você pode tentar este comando:

  ls -C1 file*log |  perl -ane 'chomp;$d=$_; s/^(\w+?)_(\d+?)_.*/$1s_$2.log/; print "mv -v $d $_\n";' | bash

O script perl gera o comando para o movimento. Deixe o pipe para bater para ver se o comando faz o que você quer. O perl de uma linha lê a lista de arquivos de stdin e corresponde a primeira palavra seguida por um sublinhado seguido por um grupo de dígitos e, em seguida, imprime o comando de movimento. Se você precisar de algo diferente de linux, o perl pode simplesmente renomear o arquivo para você. Ressalvas. O one-liner é cru e não manipula nomes de arquivos com um caminho.

    
por 20.01.2017 / 23:37

Tags