我有一个包含 .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 -ls
orfind -exec ls
或find -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 行打印一次。stat
sort
awk
答案3
如果你没有 GNU 工具或者你的文件名包含很多特殊字符,我会使用其中之一Gilles的优秀解决方案。
然而,这里有一个使用 GNU 、 和find
-sort
基本上是一组工具的解决方案cut
awk
亚历克斯建议:
$ 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
代码。说实话,我不确定这个解决方案将如何与空白交互。