【问题标题】:how to find the directory that contains the test with the last date?如何找到包含最后日期测试的目录?
【发布时间】:2014-02-06 18:59:34
【问题描述】:

我有一个包含许多文件和目录的目录, 我想查找具有日期的名称格式的目录之一:

p**_yyyymmdd

我可以编写一个命令来查找(通过名称而不是时间戳)在 shell 脚本中显示具有最后日期(最高 yyyy 然后最高 mm 然后最高 dd)的目录名称吗?

在此处添加文件名示例:

p00_20131208 p00_20131220 p00_20140107 p01_20130324 

【问题讨论】:

  • 你能提供一些这些目录的例子吗?
  • p00_20131208 p00_20131220 p00_20140107 p01_20130324

标签: linux bash shell sed grep


【解决方案1】:
find . -type d -name 'p??_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' |
sort -t _ -k2nr |
head -1

【讨论】:

    【解决方案2】:

    我有一个目录,里面有很多文件和目录,

    看起来您只想在一个目录中执行此操作,然后您才执行此操作:

    cd /my/directory
    
    p1='p*_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    printf "%s\n" $p1|sort -t_ -nk2|head -1
    

    【讨论】:

    • 我将您的命令与用户 Daniele 建议的排序命令一起使用,最终命令是:ls -dtr p**_[0-9][0-9][0-9][0 -9][0-9][0-9][0-9][0-9] |排序-n | tail -1 因为你一个人给了我最后修改的时间戳,而不是最后一个日期,但是谢谢!
    • 其实这里不需要排序,因为我使用的是ls -tr,它已经进行了排序。
    • 让我向您解释一下是怎么回事:假设我在这里有五个文件夹:p00-20130203 p00-20130403 p00-20130503 p00-20140203 gwmposd_ap 让我们假设在执行您的命令之前,我例如,修改了文件夹 p00-20130403 之一的内容。执行你的命令不会给我我正在寻找的结果是 p00-20140203,但会给我最后修改的结果是 p00-20130403。这就是你需要排序的原因。
    • 好的,可以为这种情况添加排序,但 find 是多余的,因为我们只处理单个目录。
    • 使用更强大的方法检查更新的答案,以查找具有给定模式的最新目录。
    【解决方案3】:

    此脚本将查找名称以 6 位结尾的每个目录,并将它们放入文件 tmp。

    在第二部分中,它从名称中提取日期(它获取最后 6 个字符,因此如果查找返回的文件夹以 ./ 或 ./subfolder/ 之类的相对路径开头,这不是问题)。

    最后它会找到最新的日期并打印对应名称的文件夹。

    #!/bin/bash
    find . -type d | egrep "p.._[0-9]{6}" > tmp
    
    date=$(for r in $(cat tmp)
    do
        echo ${r: -6}
    done | sort -nr | head -1)
    cat tmp | grep $date
    

    【讨论】:

    • 我使用了您在此处建议的排序方法和提取日期的命令,它有效:最终命令是:ls -dtr p00_[0-9][0-9][0-9 ][0-9][0-9][0-9][0-9][0-9] |排序-n |尾 -1 谢谢
    【解决方案4】:

    假设没有多个目录具有相同的日期:

    #!/bin/bash
    
    IFS=$'\n'
    unset newestDir
    for currDir in `ls -1f`
    do
        if [[ -d "$currDir" && "$currDir" =~ ^p.*_[0-9]{8}$ ]]; then
            if [[ ! "$newestDir" ]]; then
                newestDir=$currDir
            else
                newestDate=${newestDir:(-8)}
                currDate=${currDir:(-8)}
                if (( $currDate > $newestDate )); then
                    newestDir=$currDir
                fi
            fi
        fi
    done
    
    echo $newestDir
    

    【讨论】:

      【解决方案5】:

      试试这样的:

      find . -type d -name "p*" -exec ./process {} \; | sort > file
      

      将以下内容保存为文件“进程”并运行“chmod +x 进程”后

      #!/bin/bash
      p=$1
      yyyymmdd=${p#*_}    # Strip everything before underscore
      y=${yyyymmdd:0:4}   # Extract 4 chars for year
      m=${yyyymmdd:4:2}   # Extract 2 chars for month
      d=${yyyymmdd:6:2}   # Extract 2 chars for day
      echo $y $m $d $p
      

      显然,您可以对文件进行不同的排序,然后随心所欲地使用它。

      【讨论】:

        猜你喜欢
        • 2013-06-02
        • 2011-11-09
        • 2011-08-28
        • 1970-01-01
        • 2013-11-10
        • 2023-03-17
        • 2016-09-04
        • 2017-08-27
        • 1970-01-01
        相关资源
        最近更新 更多