ファイル名に指定されたシリアル番号に基づいて最新のファイルを選択します。

ファイル名に指定されたシリアル番号に基づいて最新のファイルを選択します。

私のディレクトリにはいくつかのファイルしかなく、処理する最も古いファイルを選択する必要があります。

Expの場合:/ tmpディレクトリに次のファイルがあります。

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

したがって、私のスクリプトは最初にファイル名の最初の10桁のセットに基づいてファイルをソートする必要があります。オコココック、最初の10桁の数字セットに複数の項目がある場合は、次の3桁の数字セットを並べ替える必要があります。、最も古いものを選択する必要があります。

処理するファイルを選択したら、そのファイルをディレクトリから削除します。したがって、次回実行すると表示されません。

したがって、最初の実行では、Sample_0000137294-003_xyz.datファイルを選択する必要があります。

2番目の実行では、Sample_0000237826-001_xyz.datを選択する必要があります。

3番目の実行では、Sample_0000237826-002_xyz.datを選択する必要があります。

など。

誰もが忘れたことの1つは、上記のように、このファイルがリモートサーバーから自分のローカルサーバーに1つずつコピーされることです。だから私はコピーに "rsync"を使用します。したがって、以下の解決策がrsyncコマンドでも機能するかどうかを教えてください。

答え1

そしてzsh

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

一致するファイル名(正の10進数と一致)のubstringをextract_numbers返すソート関数()を定義します。SM<->-<-><->

この関数を使用してグローバルをn数値でoソートします*<->.<->*.dat

答え2

仮説

  • すべてのファイルがサンプルで始まるわけではありません。
  • 数値フィールドは次のように表示されます。_
  • ファイル時間を渡すことができません。

私は使用します

sort -t_ -k2n

例で提供されている4つのファイルの出力

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

答え3

#!/bin/bash

ls /tmp/*dat > filelist

while read fn
do 
    #do something with /tmp/$fn
done < filelist

答え4

このコマンドは、パターンが次のと仮定すると、数値フィールドでソートされているファイルのファイル名のみを提供しますSample_nnnnnnnnnn-ppp_xyz.dat

ls Sample_$(ls -l *.dat | awk -F ' |_' {'print $10'} |sort -n| head -1)*.dat

関連情報