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

rad*_*ven 4 osx scripting find shell-script

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

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

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

我正在使用 MacOS 雪豹,顺便说一句。

谢谢!

Gil*_*il' 6

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

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

echo **/*.png(oL)
Run Code Online (Sandbox Code Playgroud)

没有方便的 glob 限定符来抓取每 N 个文件。这是一个循环,它将数组设置$a为包含每 50 个文件(从最大的文件开始)。

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

如果没有 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)
'
Run Code Online (Sandbox Code Playgroud)

这是查看每 50 个文件(从最大文件开始)的方法:

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

另一种方法是在单个目录中创建符号链接,名称按文件大小排序。在 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
Run Code Online (Sandbox Code Playgroud)

使用 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);
    }
'
Run Code Online (Sandbox Code Playgroud)