少なくとも4桁の数字のファイルを探す

少なくとも4桁の数字のファイルを探す

このようなファイルが多すぎます。[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

関連情報