Bash 如何递归地获取子目录的时间戳

Bash 如何递归地获取子目录的时间戳,bash,shell,unix,Bash,Shell,Unix,我希望递归地获取子目录的时间戳,并写入一个新文件。下面是我编写的示例脚本。但这并不是递归发生的 #!/bin/bash CURRENT_DATE=`date +'%d%m%Y'` Year=`date +%Y` Temp_Path=/appinfprd/bi/infogix/IA83/InfogixClient/Scripts/IRP/ File_Path=/bishare/DLSFTP/ cd $File_Path echo $Year find /bishare/DLSFTP/$Year*

我希望递归地获取子目录的时间戳,并写入一个新文件。下面是我编写的示例脚本。但这并不是递归发生的

#!/bin/bash
CURRENT_DATE=`date +'%d%m%Y'`
Year=`date +%Y`
Temp_Path=/appinfprd/bi/infogix/IA83/InfogixClient/Scripts/IRP/
File_Path=/bishare/DLSFTP/
cd $File_Path
echo $Year
find /bishare/DLSFTP/$Year*  -type d | ls -lrt > $Temp_Path/New_Bishare_File_Data_$CURRENT_DATE.txt

问题是
ls
忽略了stdin。相反,请尝试:

find /bishare/DLSFTP/$Year* -type d -exec ls -dlrt {} +
讨论 例如,让我们在没有参数和stdin的情况下运行
ls-d

$ ls -d
.
现在,让我们在stdin上提供目录名
a

$ echo A | ls -d
.
如您所见,
ls
忽略了stdin。现在,让我们在命令行中提供名称
A

$ ls -d A
A
这是成功的
ls
返回目录
A
的名称

find
命令中,
-exec ls-lrt{}+
告诉
find
将它找到的目录名称放在
ls-lrt
后面的命令行上,然后执行
ls
。这就是你需要的

还请注意,
ls-lrt
将报告目录中的文件。要仅显示目录上的信息,请使用
-d
ls-dlrt

备选案文1 如果系统上的
find
支持
-printf
,则我们可以取消使用
ls
,并为输出获取自定义格式(帽子提示:)。例如:

find .  -type d -printf '%t %p\n'
%t
打印时间戳,
%p
打印目录名。GNU
find
支持这一点

备选案文2 尽管它缺乏
ls
find-printf
的格式灵活性,但还有另一个选项:
find
具有
-ls
操作:

find .  -type d -ls

这也可能需要GNU
find

现在我得到的是所有文件的时间戳,而不是目录。如果您只想查看目录,请像上面的示例一样,将
-d
选项添加到
ls
find/bishare/DLSFTP/$Year*-键入d-exec ls-dlrt{}+
,而不是
-exec ls
,查看
-printf
以获得正确的机器可读格式的输出。@tripleee极好的建议!我添加了一个printf解决方案。不幸的是,某些查找(例如打开的查找)不支持
-printf
;它没有什么特别的危害,但是如果您告诉
find
使用绝对路径,那么也没有必要这样做。您可能应该使用
find“$File\u Path/$Year”*…
来正确使用变量。否则,如果有任何移动,则必须更改脚本中的两行而不是一行。