无法在 solaris 中使用 find 语句执行命令

unable to execute command with find statement in solaris

该脚本 运行 在 ubuntu Linux 上正常运行,我可以调用 bin_packing.awk,但是当我在 unix solaris 上尝试 运行 它时我收到一个错误:

find: bad option -printf
find: [-H | -L] path-list predicate-list
awk: syntax error near line 1
awk: bailing out near line 1

这是适用于 ubuntu

的脚本
$ find . -type f -iname '*pdf' -printf "%s %p\n" \
  | awk -v c=100000 -f bin_packing.awk

我已经试过了,它可以工作,但没有 | awk...部分

 $ find . -type f -name '*.pdf' -print | perl -lne '$,=" "; @s=stat $_; print $s[7],$_' \
  | awk -v c=100000 -f bin_packing.awk

在现代系统上,您可以使用 GNU stat 或 GNU find 来提取大小,而无需执行诸如解析 ls.

之类的糟糕操作

不幸的是,您使用的不是现代系统,所以是时候做些糟糕的事情了。幸运的是,大小是 ls 的字段之一,可以 semi-reliably 解析(当 运行 一次只对一个文件进行解析时),只要您使用的平台不支持'允许疯狂的事情,例如带空格的用户名。

find . -type f -iname '*.pdf' -exec bash -c '
for name; do
  read -r _ _ _ _ size _ < <(ls -l -- "$name")
  printf "%s %s\n" "$size" "$name"
done
' _ {} + | awk -v c=100000 -f bin_packing.awk

如果 -exec ... {} + 语法不起作用,您可以将 + 更改为 \; 以使其更慢但更兼容。

如果您有当前版本的 Solaris,则可以使用 find-print 选项。对于较旧的 Solaris,使用 gfind(对于 GNU 查找)。