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