处理/显示按大小排序的图像树的最佳方法

处理/显示按大小排序的图像树的最佳方法

我有一个包含 .PNG 文件的深层目录树。我想找到目录中的所有 .PNG 文件,按大小从小到大的顺序对它们进行排序,然后显示每 50 个图像。

(我正在分析数据并试图找到“潜在有用”和“随机噪声”之间的最佳大小截止,所以我想要一种简单的方法来浏览这数千张图像......)

任何脚本帮助都是值得赞赏的。我知道如何使用“查找”按大小进行搜索,但不知道如何对结果进行排序或运行显示程序以每 50 次显示一次而不让它暂停进程等待。

顺便说一句,我正在使用 MacOS Snow Leopard。

谢谢!

答案1

该大小是文件大小还是图像尺寸?

在 zsh 中,要查看.png当前目录及其子目录中的所有文件,按文件大小递增排序:

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

如果没有 zsh 或 GNU find,就没有简单的方法可以find按元数据对输出进行排序(有find -lsorfind -exec lsfind -exec stat,但它们可能不适用于包含不可打印字符的文件,所以我不喜欢推荐它们)。这是用 Perl 实现的方法。

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

使用 Perl:

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

答案2

只需结合find搜索*.png或获取文件大小、ls按文件大小排序并仅每 50 行打印一次。statsortawk

答案3

如果你没有 GNU 工具或者你的文件名包含很多特殊字符,我会使用其中之一Gilles的优秀解决方案

然而,这里有一个使用 GNU 、 和find-sort基本上是一组工具的解决方案cutawk亚历克斯建议

$ find -iname "*.png" -exec ls -s {} + | sort -n | cut -d" " --complement -f1 | awk '{ if ( NR % 50 == 0 ) print}' | xargs -d"\n" eog

这里我用过侏儒之眼( eog) 作为图像查看器,主要是因为它是我能找到的少数几个接受多个命令行参数并用它做一些有意义的事情的图像查看器之一。

我确信人们可以删除sort和 来cut支持更多awk代码。说实话,我不确定这个解决方案将如何与空白交互。

相关内容