在Linux下,以下行创建一个文本文件:
find "/path/to/pdfs/" -type f -name "$1*.pdf" -printf "%TY/%Tm/%Td %TH:%TM %p\n" \
| sort -n -k1.1,1.2 -k1.3,1.4 -k1.6,1.7 -k1.9,1.10 -k2.1,2.2 -k2.4,2.5 -k3 \
> remoteuser@remoteserver:/u/tmp/CustTmp/zzz_pdfs.txt
此文本文件包含:
2013/12/31 16:43 /path/to/pdfs/list1.pdf
2013/12/31 17:36 /path/to/pdfs/list2.pdf
2013/12/31 17:38 /path/to/pdfs/list3.pdf
在AIX下,上述命令失败,因为AIX上的-printf
命令中不存在find
。如何解决这个限制?
答案 0 :(得分:1)
您遇到的问题不是shell问题。这是你的find
命令不兼容。
我猜你在Linux机器上运行Bash,在Solaris上运行Kornshell。问题是您的Linux机箱具有find
命令的GNU版本,其中包含-printf
参数,而其他系统上的find
命令则没有,因为它使用的是BSD或AT& T Unix版本的命令。
您需要做的是使用系统的stat
命令从文件中提取所需信息:
find "/path/to/pdfs/" -type f -name "$1*.pdf" -exec stat ??? {}\; | sort ...
问题是我不知道stat命令的格式。不幸的是,这个命令因系统而异。看起来您正在根据find time directives上的GNU文档创建排序修改日期。这是我运行Mavericks的Mac上的等价物:
find "/path/to/pdfs/" -type f -name "$1*.pdf" -exec stat -f "%10Dm %SN" {}\; | sort ...
-f
参数指定stat将如何打印其信息的格式。 “%10Dm specifies 10 decimal digits (
D ) of the modification time
m . The
%SN`以字符串格式指定文件的名称。这会将日期打印为Epoch的秒数(通常是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命令的这个特殊功能与-printf
中的find
参数具有相同的问题:它是特定于机器的,所以它在Linux上不起作用。
答案 1 :(得分:0)
printf命令确实存在,printf说明符不同,请尝试:
printf "%(%Y/%m/%d %H:%M)T\n"