0

メインディレクトリのサブディレクトリを検索し、最後に最大数のファイルをリストするプログラムを作成しようとしています。例: ファイル名_100。

find . -name "*_*" | sort -n | tail
4

2 に答える 2

0

sort文字列の先頭から並べ替えるため、最初にファイル名の先頭部分を分割しないと使用できません。このループはそれを行います。の後にファイル名の一部が出力され_、その後に完全なファイル名が続きます。

for fn in `find . -name '*_*'`; do
    echo "${fn##*_} $fn"
done

次に、出力をsortおよびにパイプしtailて最大数を取得し、次に にパイプしcutてファイル名自体のみを選択できます。

for fn in `find . -name '*_*'`; do
    echo "${fn##*_} $fn"
done | sort -n | tail -n 1 | cut -d' ' -f 2-

次に、ファイル名のアンダースコアの前の部分を抽出する必要があります。これはおそらく、最後の部分の結果を変数に格納することによって行うのが最適です。

largest_filename="$(for fn in `find . -name '*_*'`; do
    echo "${fn##*_} $fn"
done | sort -n | tail -n 1 | cut -d' ' -f 2-)"

その後、bash のサフィックス削除を使用してアンダースコアの後の部分を取り除き、そのプレフィックスを共有するすべてのファイルを一覧表示できます。

largest_filename="$(for fn in `find . -name '*_*'`; do
    echo "${fn##*_} $fn"
done | sort -n | tail -n 1 | cut -d' ' -f 2-)"
ls ${largest_filename%_*}_*
于 2012-10-12T20:27:17.183 に答える
0
tmp1=$(mktemp)
#retrieve largest suffix
find . -name '*_*' | xargs -n 1 basename | awk -F'_' '{print($NF, $0)}' | sort -k1,1 -n -r | awk '{print($1)}' | head -1 > $tmp1
tmp2=$(mktemp)
#retrieve file names containing largest suffix
join -o2.2 -1 1 -2 1  $tmp1 <(find . -name '*_*' | xargs -n 1 basename | awk -F'_' '{print($NF, $0)}' | sort -k1,1 ) > $tmp2
join -o2.1,2.2 -1 1 -2 1 -t"_" $tmp2 <(find . -name '*_*' | xargs -n 1 basename | sort -k1,1 -t"_")
于 2012-10-12T20:42:05.410 に答える