我们可以使用bash脚本存储文件夹(而不是文件)的创建日期吗?

时间:2016-05-23 07:22:43

标签: bash cygwin

其实我是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”来提取最新文件夹的上次修改日期,但它运行良好。

2 个答案:

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

我不确定这是否包括文件创建。

替代方法

由于获取最后创建的文件夹显然很昂贵,您也可以:

  1. 创建所述目录时保存目录名称,或
  2. 使用不需要任何额外系统调用的ddddyymm-name-of-directory等命名约定 - 只需find -type d|...