Renomear arquivos adicionar traços após o quarto e sexto caracteres

1

Eu tenho alguns arquivos como:

20150716_something-here
20150716_something-heretoo
20150716_something-hereaswell

Eles precisam ser renomeados como

2015-07-16_something-here
2015-07-16_something-heretoo
2015-07-16_something-hereaswell

Eu tentei usar uma implementação do perl do rename command (veja meu comentário sobre a resposta aceita) mas não obtive sucesso.

    
por Adrien Be 19.05.2016 / 23:52

6 respostas

1

Usando o comando perl rename (que é completamente diferente do comando rename de util-linux ):

rename -v 's/^(\d{4})(\d{2})(\d{2})/$1-$2-$3/' 2015*

(use -n em vez de -v para uma execução a seco para testar o comando primeiro).

Esta versão perl de rename pode ser chamada prename ou file-rename no seu sistema. É muito mais útil e útil do que a versão util-linux de rename . Se você não tem instalado, você deve instalá-lo. Se não estiver empacotado para sua distro, você pode instalar a partir do CPAN

BTW, você pode dizer se já o instalou executando rename -V . Se produz saída assim:

$ rename -V
Unknown option: V
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

ou isto:

$ rename -V
/usr/bin/rename using File::Rename version 0.20

Então você tem o perl rename instalado. O primeiro indica uma versão antiga (a qual o AFAIK vive apenas em instalações debian pré-jessie, incluídas como parte do pacote perl ). O último indica a versão atual (agora um pacote separado chamado rename ).

    
por 20.05.2016 / 07:15
2

com sed :

LC_ALL=C sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/__/' <file
    
por 20.05.2016 / 06:02
2

Embora rename seja uma ferramenta muito poderosa, eu normalmente prefiro a simplicidade do % co_de Utilitário% (várias movimentações) :

mmv '????????_*' '#1#2#3#4-#5#6-#7#8_#9'

O mmv no padrão de pesquisa representa um único caractere, o ? para uma sequência arbitrariamente longa de caracteres. No padrão de substituição, cada * corresponde a #<number> ou ? correspondente no padrão de pesquisa. Além de * e ? , * suporta intervalos de caracteres entre colchetes (como mmv ).

( [a-f] testará qualquer conflito na renomeação antes de começar a funcionar, portanto, você não corre o risco de perder arquivos sobrescrevendo-os.)

    
por 20.05.2016 / 09:11
2

Usando a expansão de substring integrada do bash:

for f in 2015* ; do
  mv "$f" "${f::4}-${f:4:2}-${f:6}"
done
    
por 20.05.2016 / 09:16
0

Na minha distribuição, eu tenho o comando perl-rename , que pode usar um regex no estilo do perl para renomear arquivos em massa. O comando rename só aceita um par de sequências fixas para a renomeação.

    
por 20.05.2016 / 00:05
0

solução rápida e suja não completa

#!/usr/bin/env bash
str=$1
yyyy=$(echo "$str" | awk -F '_' '{print $1}' | awk '{print substr($0, 1, 4)}')
mm=$(echo "$str" | awk -F '_' '{print $1}' | awk '{print substr($0, 5, 2)}')
dd=$(echo "$str" | awk -F '_' '{print $1}' | awk '{print substr($0, 7, 2)}')
new_str=$yyyy-$mm-$dd'_''echo $str | awk -F'_' '{print $2}''
echo $new_str

saída:

$ bash script.sh '20150716_something-here'
2015-07-16_something-here
    
por 20.05.2016 / 04:21