.PNG ファイルを含む深いディレクトリツリーがあります。ディレクトリ内のすべての.PNGファイルを見つけて、最小サイズから最大サイズにソートし、50番目の画像ごとに表示したいと思います。
(私はデータを分析し、「潜在的に有用」と「ランダムノイズ」の間の最適なサイズの区別を見つけようとしています。
すべてのスクリプトを助けてくれてありがとう。 Findを使用してサイズ別に検索する方法はわかっていますが、結果を並べ替えたりプロセスを待っている間に一時停止せずに50回ごとに表示するように表示プログラムを実行する方法はわかりません。
ところで、私はMacOS Snow Leopardを使用しています。
ありがとうございます!
ベストアンサー1
そのサイズはファイルサイズですか、それとも画像サイズですか?
.png
zshで現在のディレクトリとそのサブディレクトリのすべてのファイルをファイルサイズの増加順に並べ替えて表示するには、次の手順を実行します。
echo **/*.png(oL)
すべてのN個のファイルをインポートする便利なグローバル修飾子はありません。次のループは、配列が$a
50個のファイルごとに含まれるように設定します(最大のファイルから始まります)。
a=() i=0
for x in **/*.png(OL); do
((i%50)) || a+=$x
((++i))
done
my-favorite-image-viewer $a
find
zshまたはGNU findがないと、出力をメタデータごとに簡単に並べ替える方法はありません(または、しかし印刷find -ls
できない文字を含むファイルでは機能しない可能性があるため、お勧めしたくありません)。これはPerlで実装されました。find -exec ls
find -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);
}
'