需要等效的Linux脚本AIX脚本 - 特别是find命令

时间:2014-02-19 19:51:50

标签: shell find aix

在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。如何解决这个限制?

2 个答案:

答案 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"