rad*_*ven 4 osx scripting find shell-script
我有一个包含 .PNG 文件的深层目录树。我想找到目录中的所有.PNG文件,按大小从小到大的顺序排序,然后每50张图片显示一次。
(我正在分析数据并试图找到“潜在有用”和“随机噪声”之间的最佳大小截断值,所以我想要一种简单的方法来浏览这数千张图像......)
任何脚本帮助表示赞赏。我知道如何使用“查找”按大小搜索,但不知道如何对结果进行排序或运行显示程序以每 50 次显示一次而无需暂停进程等待。
我正在使用 MacOS 雪豹,顺便说一句。
谢谢!
该大小是文件大小,还是图像尺寸的大小?
在 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 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)
'
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)