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
打印目录名。GNUfind
支持这一点
备选案文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”*…
来正确使用变量。否则,如果有任何移动,则必须更改脚本中的两行而不是一行。