このようなファイルが多すぎます。[a-zA-Z]+\d\.\d{2}\_\d.\d{4}.end
少なくとも4桁の古いファイルを見つけたいです.end
。 (衝突時にすべてのファイルが欲しい)
Bashを使ってこれを行うには?sort
明らかに、それだけでは事前編成順序のために動作しません。
答え1
GNUツールを使用すると、次のことができます。
find . -regextype posix-extended \
-regex '.*/[a-zA-Z]+[0-9]\.[0-9]{2}_[0-9]\.[0-9]{4}\.end' -print0 |
awk -v RS='\0' -F . '
NR == 1 || $(NF-1) < min {files=$0; min = $(NF-1); next}
$(NF-1) == min {files = files "\n" $0}
END {if (NR) print files}'
以下は一般的なパターンの例です。一致するファイルのNULで区切られたリストを印刷し(NULはファイルパスには現れない唯一の文字であるため)、NULに設定されたレコード区切り文字を使用して出力を処理します(ただし、すべての実装がサポートされているわけではありませんawk
)。awk
これ)。
これフィールド区切り記号に設定されています.
。NF
はフィールド数で、$(NF-1)
最後のフィールドの前の最後のフィールドも同じです。awk
最後に、既知の値と比較して最小の数字を見つけ、そのファイルを files
awk
変数に保存します。
NUL区切りリストの代わりに改行区切りリストを保存するため、ユーザー出力にのみ使用されます。確実に後処理するには、NUL("\0"
awkで)を使用する必要があります。
答え2
とオプションfind
でBashを使用してください。sort
-t|--field-separator
-k|--key
find_files.sh
:
#!/bin/bash
first_file=$(find . -iname '*.end' | sort -t '.' -k 4.1 | head -1)
IFS='.'
fields=($first_file)
unset IFS
find . -iname "*${fields[3]}.end"
オプションには次のフォームが-k|--key
必要です。KEYDEF
フィールド番号。文字番号。有効な場合、フィールド番号は、スペースではなく-t|--field-separator
指定された区切り文字(この場合)に基づいて.
計算されます。
次に Bash を使用して、最初のファイルから必要なパターンを抽出します。入力フィールド区切り記号find
、複数のファイルが同じ4桁の数字を共有している場合は、パターンに一致するファイルをディレクトリから再検索します。
例:
$ ls -1
abc0.03_1.1921.end
def0.03_9.0311.end
ghi0.03_1.1966.end
jkl1.04_1.1916.end
mno2.04_4.9540.end
pab9.04_1.1994.end
uvx7.04_3.2002.end
yyy1.05_8.0311.end
zzz4.04_1.2097.end
$ ./find_files.sh
./yyy1.05_8.0311.end
./def0.03_9.0311.end
答え3
sort
-t
そして、-k
ファイル名のドットで区切られた部分の1つに基づいて並べ替えることができ、この場合に実行する必要があります。
-t, --field-separator=SEP
use SEP instead of non-blank to blank transition
-k, --key=KEYDEF
sort via a key; KEYDEF gives location and type
(から引用GNUソートマニュアルページ.)
答え4
perl -le '
for ( grep { /^[a-zA-Z]+\d\.\d{2}\_\d.\d{4}\.end$/ } <*.end> ) {
($n) = /(\d{4})\.end$/;
$min //= $n;
$n <= $min and $min = $n, push @{$h{$min}}, $_;
}
print for @{$h{$min}};
'
<*>
ワイルドカード構文を使用してすべての関連ファイルを収集します。ここで正しい構文ファイルはでマークする必要がありますfor
。
内部的にはfor
まず最後の 4 桁を抽出してこれを実行数と比較しminimum
、見つかったらハッシュにプッシュします。
最後に、キーを使用してハッシュされたコンテンツを印刷します$min
。