Escolha o arquivo mais recente com base no número de sequência fornecido no nome do arquivo

3

Eu tenho poucos arquivos em um diretório, eu preciso escolher o mais antigo para o processamento.

Para Exp: tenho abaixo os arquivos no diretório / tmp:

Sample_0000237826-001_xyz.dat
Sample_0000437564-001_xyz.dat
Sample_0000237826-002_xyz.dat
Sample_0000137294-003_xyz.dat

Assim, meu script deve primeiro classificar os arquivos com base no primeiro conjunto de números de 10 dígitos no nome do arquivo, ou seja, nnnnnnnnnn , e no caso do primeiro conjunto de 10 algarismos, se tiver várias entradas, deverá ordenar o próximo conjunto de números com 3 algarismos, ou seja, nnn , e deve escolher o mais antigo.

Depois que eu pegar o arquivo para processamento, vou deletá-lo do diretório. Por isso, não aparecerá durante a próxima corrida.

Por isso, para a primeira execução, devo escolher o arquivo: Sample_0000137294-003_xyz.dat

Para a segunda corrida, eu deveria escolher: Sample_0000237826-001_xyz.dat

Para a terceira corrida, devo escolher: Sample_0000237826-002_xyz.dat

e assim por diante.

Os caras esqueceram de adicionar mais uma coisa, esses arquivos serão copiados do servidor remoto para o meu servidor local, um por um, como mencionado acima, portanto, para copiar estou usando "rsync". Portanto, por favor, deixe-me saber se a solução fornecida abaixo funcionará com o comando rsync também ou não.

    
por Niraj 03.03.2015 / 14:38

5 respostas

3

com zsh :

extract_numbers() REPLY=${(SM)REPLY##<->-<->}
for file (*<->-<->*.dat(no+extract_numbers)) {
  do-what-you-will-with $file
}

Definimos uma função de classificação ( extract_numbers ) que retorna o S ubstring do nome do arquivo que M atches <->-<-> ( <-> correspondendo a qualquer decimal positivo número).

Usamos essa função para n umeric o rdering do *<->.<->*.dat glob.

    
por 03.03.2015 / 15:46
1

assumindo

  • todos os arquivos não começam com Amostra
  • Os campos numéricos
  • são pesquisados por _
  • você não pode retransmitir em tempo de arquivo

Eu usaria

sort -t_ -k2n

qual rendimento para os quatro arquivos dados na amostra

Sample_0000137294-003_xyz.dat
Sample_0000237826-001_xyz.dat
Sample_0000237826-002_xyz.dat
Sample_0000437564-001_xyz.dat
    
por 03.03.2015 / 15:03
1
#!/bin/bash

ls /tmp/*dat > filelist

while read fn
do 
    #do something with /tmp/$fn
done < filelist
    
por 03.03.2015 / 14:55
1

Você pode simplesmente fazer uma classificação simples. Supondo que seus nomes de arquivos não contenham espaços em branco ou outros caracteres estranhos, este comando sempre fornecerá o arquivo mais antigo:

find . -name '*dat' | sort -r | tail -n1

Se você precisa lidar com caracteres estranhos, use

find . -name '*dat' -print0 | sort -zr | tr '
file=$(find . -name '*dat' -print0 | sort -zr | tr '
find . -name '*dat' -print0 | sort -zr -t "_" -k 2 | tr '
for file in *dat; do
   echo "$file" ## process the file here
   rm "$file"
done
' '\n' | tail -n1
' '\n' | tail -n1) while [ -e "$file" ]; do if [ -e "$file" ]; then echo "$file"; ## Process the file here rm "$file"; fi; file=$(find . -name '*dat' -print0 | sort -zr | tr '
find . -name '*dat' | sort -r | tail -n1
' '\n' | tail -n1) done
' '\n' | tail -n1

Então, você poderia fazer algo nos moldes de

find . -name '*dat' -print0 | sort -zr | tr '
file=$(find . -name '*dat' -print0 | sort -zr | tr '
find . -name '*dat' -print0 | sort -zr -t "_" -k 2 | tr '
for file in *dat; do
   echo "$file" ## process the file here
   rm "$file"
done
' '\n' | tail -n1
' '\n' | tail -n1) while [ -e "$file" ]; do if [ -e "$file" ]; then echo "$file"; ## Process the file here rm "$file"; fi; file=$(find . -name '*dat' -print0 | sort -zr | tr '%pre%' '\n' | tail -n1) done
' '\n' | tail -n1

Se você realmente precisar classificar apenas o primeiro conjunto de 10 dígitos, poderá fazer algo como (supondo que você deseja classificar entre os dois primeiros _ ):

%pre%

Observe também que, no caso de você mostrar onde todos os arquivos começam com os mesmos caracteres e apenas os números mudam, você não precisa classificar nada:

%pre%     
por 03.03.2015 / 15:05
0

Este comando dará o nome do arquivo de apenas um arquivo classificado pelos campos numéricos, assumindo que o padrão é Sample_nnnnnnnnnn-ppp_xyz.dat :

ls Sample_$(ls -l *.dat | awk -F ' |_' {'print $10'} |sort -n| head -1)*.dat
    
por 03.03.2015 / 15:05