サイズでソートされた画像ツリーを処理/表示する最良の方法

サイズでソートされた画像ツリーを処理/表示する最良の方法

.PNG ファイルを含む深いディレクトリツリーがあります。ディレクトリ内のすべての.PNGファイルを見つけて、最小サイズから最大サイズにソートし、50番目の画像ごとに表示したいと思います。

(私はデータを分析し、「潜在的に有用」と「ランダムノイズ」の間の最適なサイズの区別を見つけようとしています。

すべてのスクリプトを助けてくれてありがとう。 Findを使用してサイズ別に検索する方法はわかっていますが、結果を並べ替えたりプロセスを待っている間に一時停止せずに50回ごとに表示するように表示プログラムを実行する方法はわかりません。

ところで、私はMacOS Snow Leopardを使用しています。

ありがとうございます!

ベストアンサー1

そのサイズはファイルサイズですか、それとも画像サイズですか?

.pngzshで現在のディレクトリとそのサブディレクトリのすべてのファイルをファイルサイズの増加順に並べ替えて表示するには、次の手順を実行します。

echo **/*.png(oL)

すべてのN個のファイルをインポートする便利なグローバル修飾子はありません。次のループは、配列が$a50個のファイルごとに含まれるように設定します(最大のファイルから始まります)。

a=() i=0
for x in **/*.png(OL); do
  ((i%50)) || a+=$x
  ((++i))
done
my-favorite-image-viewer $a

findzshまたはGNU findがないと、出力をメタデータごとに簡単に並べ替える方法はありません(または、しかし印刷find -lsできない文字を含むファイルでは機能しない可能性があるため、お勧めしたくありません)。これはPerlで実装されました。find -exec lsfind -exec stat

find . -name '*.png' |
perl -e '
    $, = "\n";  # separate elements by newlines in the output
    print  # print…
        sort {-s $a <=> -s $b}  # …sorted by file size…
            map {chomp;$_} <>  #…the input lines (with the newline bitten off)
'

50個のファイルすべてを見る方法は次のとおりです(最も大きいファイルから始まります)。

find . -name '*.png' |
perl -e '
    $, = "\n";
    exec "my-favorite-image-viewer",
        map {$i++ % 50 ? () : $_}  # every 50
            sort {-s $b <=> -s $a} map {chomp;$_} <>
'

別のアプローチは、単一のディレクトリにファイルサイズで名前が付けられたシンボリックリンクを作成することです。 zshから:

mkdir tmp && cd tmp
i=1000000  # the extra 1 on the left ensures alignment
for x in ../**/*(oL); do
    ((++i))
    ln -s $x ${i#1}.png
done

パールの使用:

mkdir tmp && cd tmp
find .. -name '*.png' |
perl -e '
    $, = "\n";
    for $x (sort {-s $a <=> -s $b} map {chomp;$_} <>) {
        symlink $x, sprintf("%06d", ++$i);
    }
'

おすすめ記事