Renomeando arquivos enquanto mantém porções

0

Eu preciso renomear partes de vários arquivos, mantendo o endereço IP que está nos nomes de arquivo.

Por exemplo,

Abc_192.168.1.164_001.txt
Abc_10.11.76.112_001.txt
Abc_54.78.1.1_002.txt

Eu preciso manter a parte "Abc_", bem como o endereço IP. Tudo depois deve ser substituído por um carimbo de data e hora. Eu estaria adicionando o carimbo de data e hora atual como "_yymmdd-yymmdd-hhmmss" e estaremos alterando a extensão para ".csv". Isso será executado no Linux.

    
por Hubert C 13.09.2016 / 18:14

2 respostas

1

Aqui está um loop de shell simples para (cuidadosamente) renomear os arquivos como eu acho que você está perguntando:

d=$(date +%y%m%d-%y%m%d-%H%M%S)
for f in Abc_*.*.*.*_*.txt
do
  new=${f%_*}_${d}.csv
  [ ! -f "$new" ] && mv "$f" "$new"
done

Primeiro, captura o registro de data e hora, no formato que você escreveu, em uma variável chamada d . Em seguida, ele passa por um formato glob simplista para pegar todos os arquivos cujo nome começa com "Abc_" e depois tem qualquer coisa entre os três períodos, seguido por qualquer coisa, seguido por um sublinhado e qualquer coisa, terminando em ".txt". / p>

Ele calcula o novo nome do arquivo retirando tudo (incluindo e) após o último sublinhado e, em seguida, acrescenta o registro de data e hora ( ${d} ) e a nova extensão ".csv".

Se esse novo nome de arquivo não existir, ele renomeará o arquivo. Remova a parte [ ! -f "$new" ] && se você não se preocupa em destruir arquivos existentes.

Adicione um echo antes do mv se você quiser ver uma execução seca do que faria antes de executá-lo.

Quando eu o executo, vejo:

$ touch Abc_10.11.76.112_001.txt Abc_192.168.1.164_001.txt Abc_54.78.1.1_002.txt
$ d=$(date +%y%m%d-%y%m%d-%H%M%S)
$ for f in Abc_*.*.*.*_*.txt; do new=${f%_*}_${d}.csv; [ ! -f "$new" ] && mv "$f" "$new"; done
$ ls -1
Abc_10.11.76.112_160913-160913-140649.csv
Abc_192.168.1.164_160913-160913-140649.csv
Abc_54.78.1.1_160913-160913-140649.csv
    
por 13.09.2016 / 20:12
1

Se por data e hora , você quer dizer a hora da modificação do arquivo, com zsh você poderia fazer:

zmodload zsh/stat
autoload zmv

zmv -n '(*_*_)*(.txt)' '$1$(zstat -F %FT%T%z +mtime -- $f)$2'

(remova -n para fazer a renomeação)

Note que, para aqueles arquivos .txt que são links simbólicos, o registro de data e hora é baseado no horário de modificação do destino do link simbólico, não no do próprio link simbólico. Adicione a opção -L a zstat para usar o horário de modificação do próprio link simbólico.

%FT%T%z fornece um registro de data e hora local não ambíguo, como 2016-09-13T17:32:17+0100 . Você pode adaptar-se à sua necessidade usando o formato strftime() padrão (o mesmo que com date +<format> ). Entretanto, observe que zsh ' zstat não suporta precisão de sub-segundo (para sistemas de arquivos que armazenam tempos de modificação com precisão de sub-segundo).

Se em um sistema GNU, você pode usar o GNU date -r em vez de zstat para obter esses nanossegundos:

$ zmv -n '(*_*_)*(.txt)' '$1$(date -r $f +%FT%T.%N%z)$2'
mv -- Abc_192.168.1.164_001.txt Abc_192.168.1.164_2016-09-13T17:32:17.368805094+0100.txt

Como para zstat , isso leva o tempo de modificação do destino dos links simbólicos, não do próprio link simbólico. date não tem opção de usar o mtime do symlink, embora você possa usar o GNU find .

    
por 13.09.2016 / 18:35

Tags