Renomeie arquivos em um diretório

1

Eu tenho os nomes dos arquivos abaixo em um diretório

example1.1.timestamp(.1457644337)
example1.2.timestamp
example1.3.timestamp

e assim por diante, cerca de 100 arquivos. Preciso renomear todos os arquivos removendo .timestamp(.1457644337) no final.

Eu consegui fazer isso por um único arquivo

ls -l filename | sed 's/\.[^.]*$//'
    
por tradersjoe 11.03.2016 / 18:19

2 respostas

4

Usando rename ( prename ):

  • Se o registro de data e hora for o mesmo para todos os arquivos, no diretório que contém os arquivos que você pode fazer:

    rename -n 's/\.1457644337$//' example1.*.*
    
  • Para timestamps variados:

    rename -n 's/\.\d+$//' example1.*.*
    

Recursivamente:

find . -type f -name 'example1.*.*' -exec rename -n 's/\.\d+$//' {} +

Remova -n (dry-run) se você estiver satisfeito com as alterações a serem feitas.

Observe que isso removerá a última parte contendo dígitos, incluindo . . Então, se você tiver apenas um número aleatório além do timestamp que será removido também.

Usando a expansão de parâmetros do shell:

  • Se o carimbo de data / hora for o mesmo para todos os arquivos:

    for file in *.*; do mv -i "$file" "${file%.1457644337}"; done
    
  • Para timestamps variáveis, assumindo bash (outras camadas avançadas têm opções semelhantes):

    shopt -s extglob; for file in *.*; do mv -i "$file" "${file%.+([0-9])}"; done
    

Recursivamente:

find . -type f -name 'example1.*.*' -exec \
    bash -ic 'shopt -s extglob; mv -i "$1" "${1%.+([0-9])}"' _ {} \;

Aqui eu usei a opção extglob shell para corresponder aos dígitos após o último . usando o padrão +([0-9]) , portanto o padrão de expansão do parâmetro de substituição se torna ${file%.+([0-9])} .

Novamente, isso não corresponde estritamente a um registro de data e hora. Embora você possa modificar o padrão para obter robustez se tiver um formato preciso para o timesatmps.

    
por 11.03.2016 / 18:36
0

modo interativo, com comandos de inspeção visual:

ls | vim -

dentro do vim:

:%s/.*/mv 
ls | vim -
:%s/.*/mv %pre% %pre%/        ...move filename filename
:%s/\.[^.]*$//          ...same as your sed regex
:w !sh                  ...run buffer with shell
:q!                     ...close without saving
/ ...move filename filename :%s/\.[^.]*$// ...same as your sed regex :w !sh ...run buffer with shell :q! ...close without saving
    
por 11.03.2016 / 19:32