【问题标题】:Need equivalent AIX script for Linux script - specifically the find commandLinux 脚本需要等效的 AIX 脚本 - 特别是 find 命令
【发布时间】:2014-03-20 09:33:43
【问题描述】:

在 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 上的 find 命令中不存在 -printf。如何解决此限制?

【问题讨论】:

  • 这与find有关,与bashksh无关。您是否在不同的系统上运行这些? find --version 对他们每个人说了什么?
  • 是的,两个不同的系统/操作系统 (Linux VS AIX) 在 Linux 上,查找版本是 4.4.2;在 AIX 上,“find --version”命令返回“Usage: ...”结果
  • 以后,最好用 AIX 标记您的 AIX 问题,因为它与大多数人熟悉的 Linux 有很大不同。您可能会查看您的系统管理员是否知道 find 的任何替代版本。可以在 AIX 上安装 GNU find,但不是常见的做法。祝你好运。

标签: shell find aix


【解决方案1】:

printf命令确实存在,printf说明符不同,试试:

printf "%(%Y/%m/%d %H:%M)T\n"

【讨论】:

  • ksh 下不存在 find 命令的“-printf”选项。我知道 printf 命令存在于 KSH 下。因此我的问题。
  • 再次声明,这与 ksh 无关。它与 AIX 上存在的 find 命令的版本有关。 man find 应该告诉您有哪些可用选项。 (如果您需要特定于 GNU 的选项,您可以安装 GNU findutils,作为二进制包或从源代码构建。)
【解决方案2】:

您遇到的问题不是外壳问题。就是你的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 文档创建排序修改日期。这是在我的 Mac 上运行 Mavericks 的等价物:

find "/path/to/pdfs/" -type f -name "$1*.pdf" -exec stat -f "%10Dm %SN" {}\; | sort ...

-f 参数指定 stat 如何打印其信息的格式。 "%10Dmspecifies 10 decimal digits (D) of the modification timem. 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 上不起作用。

【讨论】:

  • 谢谢大卫,我会试一试并报告!
  • 好吧,这在 AIX 上也不起作用 - 感谢您的尝试!
猜你喜欢
  • 2020-07-01
  • 2019-11-18
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多