bash 错误查找:-printf:未知的主要或运算符

bash 错误查找:-printf:未知的主要或运算符

我列出了我电脑中的所有文件。

FILES=$(find . -type f -name '*' -printf "%s/%f\n" | sort -n)

输出应该是:

"size/file_name"
56872/file.txt
98566/test
1000254/foo

我的电脑给我错误

find: -printf: unknown primary or operator

有什么解决办法吗?

答案1

-printf选项不在POSIX find。这是GNU的一个特性find,例如,在 Linux 上。

未显示您正在使用的特定实现;它可能是没有扩展的 POSIX。例如,它不在自由BSD, 或者操作系统X

如果没有它,您可以使用一些替代方案,例如(它不会处理嵌入的空白等,但对您的工具做出很少的假设):

find . -type f -exec ls -ld {} \; | awk '{ gsub("^.*/","",$9); printf "%s/%s\n", $5, $9; }'

有了有关可用工具的更多信息,(通常)可以改进解决方案。

答案2

findxargsGNU stat

find . -type f -print0 | xargs -0r stat -c '%s/%n'

对于这个特定的问题,实际上并不需要这个 GNU 版本,因为 GNU无论如何都find支持printf(但它在其他上下文中可能很有用,因为有些东西stat可以找到有关find ... -printf无法显示的文件的信息)。

然而,FreeBSD 和 Mac OS X 则是另一回事。

find以及xargsFreeBSD(和 Mac OS X)stat

find . -type f -print0 | xargs -0r stat -f '%z/%N'

可以选择通过管道传输输出sed -e 's:/./:/:'以删除./每个文件名开头的 。

示例输出,来自我的 FreeBSD 测试虚拟机:

# find . -type f -print0 | xargs -0r stat -f '%z/%N' | sed -e 's:/./:/:' | head
149/.k5login
254/.profile
1169/.cshrc
297/.login
5589/.history
171/.ssh/known_hosts
1803/.ssh/authorized_keys
6699/.bash_history
368/.bashrc
4065/.viminfo

相关内容