您遇到的问题不是一个shell的问题。这是你的find命令不兼容。
我猜你正在Linux上运行Bash,在Solaris上运行Kornshell。问题在于你的Linux机器有GNU版本的find命令,其中有-printf参数,而你的其他系统上的find命令不会因为它使用BSD或AT Unix版本的命令。
你需要做的是使用系统的stat命令来拉你从文件所需的信息:
find "/path/to/pdfs/" -type f -name "$1*.pdf" -exec stat ??? {}\; | sort ...
问题是我不知道stat命令的格式。不幸的是,这个命令因系统而异。看起来您正在根据关于find time directives的GNU文档创建排序修改日期。这里是我的Mac上运行小牛等价物:
find "/path/to/pdfs/" -type f -name "$1*.pdf" -exec stat -f "%10Dm %SN" {}\; | sort ...
的-f参数指定统计如何将其打印信息的格式。在“%10Dm specifies 10 decimal digits ( d) of the modification time米. The%SN`指定字符串格式文件的名称,这打印日期的秒从历元(通常是1970年1月1日)的数量。
在原来的排序,你被指定的日期时间标记的每一个领域(这是不是真的有必要,那么你的sort会更简单:
find "/path/to/pdfs/" -type f -name "$1*.pdf" -exec stat -f "%10Dm %SN" {}\; \
| sort -k1,1n -k2,2
不幸的是,这并不像你一个很好的整齐格式打印出来的时间因此,我们将在排序后剥离文件名并通过stat再次打印文件
find "/path/to/pdfs/" -type f -name "$1*.pdf" -exec stat -f "%10Dm %SN" {}\; \
| sort -k1,1n -k2,2 sed 's/.* //'
| while read file
do
stat "%-22.22Sm %N" $file
done
这将打印出的文件为:
Dec 12 15:38:43 2013 /path/to/pdfs/list1.pdf
不完全一样,但已经很接近了。实际上,在我的Mac上,我可以从第一个stat命令中获取日期的数字输出,并将其转换为所需格式的日期字符串。
不幸的是,date命令的这个特殊功能与find中的-printf参数具有相同的问题:它是特定于计算机的,因此它在Linux上不起作用。