其实我是Bash的新手,我正在学习一些动手......我使用了以下stat命令:
find "$DIRECTORY"/ -exec stat \{} --printf="%w\n" \; | sort -n -r | head -n 1 > timestamp.txt
其中DIRECTORY是任何路径,c:/ some / path。它包含很多文件夹。我需要提取最新创建的文件夹的创建日期,并将其存储在变量中以供进一步使用。在这里,我开始将其存储在txt文件中。但脚本永远不会完成。它在到达此命令行时保持卡住状态。请帮忙。我正在使用cygwin。我曾使用--printf =“%y \ n”来提取最新文件夹的上次修改日期,但它运行良好。
答案 0 :(得分:0)
您可以使用-type d
选项仅包含当前文件夹中的目录,并且如评论部分所述,如果您需要stat
中仅yyyy-mm-dd
的输出格式,请使用awk
,如下所示。
find "$DIRECTORY"/ -type d -exec stat \{} --printf="%w\n" \; | sort -n -r | head -n 1 | awk '{print $1}'
将值存储在bash
变量中: -
$ myvar=$(find "$DIRECTORY"/ -type d -exec stat \{} --printf="%w\n" \; | sort -n -r | head -n 1 | awk '{print $1}')
$ echo $myvar
2016-05-20
答案 1 :(得分:0)
命令没问题(保存为转义\{}
,我相信这是一个错误的帖子)。它似乎永远不会完成,但如果有足够的时间,它就会完成。
主要瓶颈在于为每个文件执行stat
。 Cygwin下的产卵过程非常缓慢,为每个可能数千个文件执行一个是完全不可行的。避免这种情况的唯一方法是不产生这样的过程。
尽管如此,我认为还有一些方面需要改进:
-type d
传递给find
命令以过滤掉任何文件。如果你只需要修改时间(看看Linux here上的目录修改时间是什么意思,我想这在Cygwin中可能类似),你可以使用find
的内置设施而不是stat
这样:
find "$DIRECTORY"/ -type d -printf '%TY-%Tm-%Td %TH:%TM:%TS %Tz %p\n' \
| sort -nr \
| head -n1 \
| cut -f4 -d' '
我们使用cut
剪切路径之前的示例行 - -printf
中的大多数内容用于格式化日期:
2014-09-25 09:41:50.3907590000 +0200 ./software/sqldeveloper/dataminer/demos/obe
cut
之后:
./software/sqldeveloper/dataminer/demos/obe
扫描560个目录和2300个文件需要0.7秒。
你的帖子中的原始命令在没有-type d
技巧的情况下花了28秒,在同一目录上运行时花了-type d
技巧。
最后但并非最不重要的是,如果$DIRECTORY
为空,您的命令将修剪整个目录树,这将花费大量时间。
如果您只需要目录中子目录的创建日期(例如,不是目录的路径),您可以只使用stat
:
stat --printf '%Y' "$DIRECTORY"/
我不确定这是否包括文件创建。
由于获取最后创建的文件夹显然很昂贵,您也可以:
ddddyymm-name-of-directory
等命名约定 - 只需find -type d|...
。