unix命令用于查找创建的最新目录

时间:2011-03-31 18:15:48

标签: shell unix find unix-timestamp

我想复制最近创建的目录中的文件。我怎么会在unix中这样做?

例如,如果我将目录名称作为日期戳,则为:

/20110311
/20110318
/20110325

8 个答案:

答案 0 :(得分:10)

这是我认为你问的问题的答案。

当我处理名称中有日期/时间戳的许多目录时,我总是采用你拥有的 YYYYMMDD 的方法 - 最棒的是那个日期顺序是也是字母顺序。在大多数shell中(当然在bash中,我对其他shell有90%肯定),'*'扩展按字母顺序完成,默认情况下' ls '返回字母顺序。因此

    ls | head -1
    ls | tail -1

在目录中提供最早和最晚的日期。

这可以扩展到仅保留最后5个条目等。

答案 1 :(得分:6)

lastdir=`ls -tr <parentdir> | tail -1`

我不知道如何通过这里的评论系统使反引号发挥出色。只需用反引号替换那些撇号。

答案 2 :(得分:3)

经过一些实验,我想出了以下内容:

unix stat 命令在这里很有用。 '-t'选项使 stat 以简洁模式打印其输出(全部在一行中),该简洁输出的第13个元素是最后一个的unix时间戳(自纪元以来的秒数) - 修改时间。此命令将按照从最新修改到最旧修改的顺序列出所有目录(和子目录):

find -type d -exec stat -t {} \; | sort -r -n -k 13,13

希望 stat 的“简洁”模式在 stat 的未来版本中保持一致!

以下是对所用命令行选项的一些解释:

find -type d                # only find directories
find -exec [command] {} \;  # execute given command against each *found* file.
sort -r                     # reverse the sort
sort -n                     # numeric sort (100 should not appear before 2!)
sort -k M,N                 # only sort the line using elements M through N.

返回原始请求,要复制文件,可以尝试以下操作。要只输出一个目录( most recent),请将其附加到命令(注意初始管道),并将其全部反馈到带有反引号的'cp'命令中。

| head --lines=1 | sed 's/\ .*$//'

答案 3 :(得分:3)

基于ls的解决方案的问题在于它们不仅仅针对目录进行过滤。我想这个:

cp `find . -mindepth 1 -maxdepth 1 -type d  -exec stat -c "%Y %n" {} \;  |sort -n -r |head -1 |awk '{print $2}'`/* /target-directory/.

可能会做到这一点,但请注意,这只会复制直接目录中的文件。如果你想要一个更通用的答案,将你最新目录下的任何内容复制到一个新目录,我认为你最好使用rsync,如:

rsync -av `find . -mindepth 1 -maxdepth 1 -type d  -exec stat -c "%Y %n" {} \;  |sort -n -r |head -1 |awk '{print $2}'`/ /target-directory/ 

但它取决于你想要的行为。反引号中的内容的解释是:

  • . - 当前目录(您可能需要在此指定绝对路径)
  • -mindepth/-maxdepth - 将find命令仅限制为当前目录的直接子项
  • -type d - 仅限目录
  • -exec stat .. - 从find
  • 输出修改时间和目录名称
  • sort -n -r |head -1 | awk '{print $2}' - 日期命令目录并输出最近修改的
  • 的名称

答案 4 :(得分:2)

如果你的目录被命名为YYYYMMDD,就像你的问题所示,请利用字母表格式。

将所有目录放在一个数组中,然后选择第一个

dirs=(*/); first_dir="$dirs";

(这实际上是first_dir="${dirs[0]}";的快捷方式。)

同样,最后一个

dirs=(*/); last_dir="${dirs[$((${#dirs[@]} - 1))]}";

丑陋的语法,但这是它分解为:

# Create an array of all directories inside the working directory.
dirs=(*/);

# Get the number of entries in the array.
num_dirs=${#dirs[@]};

# Calculate the index of the last entry.
last_index=$(($num_dirs - 1));

# Get the value at the last index.
last_dir="${dirs[$last_index]}";

我知道这是一个老问题并且已经接受了答案,但我认为这种方法更可取,因为它在Bash中做了所有事情。没有理由产生额外的流程,更不用说parse the output of ls了。 (诚​​然,在这个YYYYMMDD名称的特殊情况下应该没问题。)

答案 5 :(得分:0)

请尝试以下命令
      ls -1tr |尾巴-1

答案 6 :(得分:0)

我编写了一个命令,可用于识别文件夹中创建的最新文件夹。那似乎是纯粹的:)

#/bin/sh
path=/var/folder_name

newest=`find $path -maxdepth 1 -exec stat -t {} \; |sed 1d |sort -r -k 14 | head -1 |awk {'print $1'} | sed 's/\.\///g'`

find $path -maxdepth 1| sed 1d |grep -v $newest

答案 7 :(得分:0)

find ~ -type d | ls -ltra

这个我最近学到的很简单实用。 此命令将按逆时间顺序显示结果。