如何获取包含相同ID的一组文件当中最新文件的路径?

如何获取包含相同ID的一组文件当中最新文件的路径?

我想编写一个脚本,将 ID 作为用户的输入。根据该输入,它将搜索目录以匹配包含给定 ID 的文件。现在,该目录中有 10 多个文件,但所有文件都包含相同的 ID。因此,如果我使用grep它,它只会按排序顺序显示文件。我不想显示所有文件,除了最新的目录中包含该 ID 的文件。假设我有、、、、、a1a2文件。所有文件都有一些信息,但只有它们的 ID 不同。a3a4a5a6

我试过了grep -lr "$read" | ls -ltr,但这只会按升序渲染文件,无法达到完整的目的。我想要一些线索/建议,如何使用路径渲染最新的文件。

答案1

以下是几种方法:

  • 如果所有文件都在同一个目标目录中($dir),那么这很简单:

    newest=$(ls -1tr $(grep -Hl "$read" "$dir") | tail -n 1)
    
  • 如果您还需要进入子目录:

    newest=$(ls -1tr $(find . -type f -exec grep -Hl "$read" {} \;) | tail -n 1)
    

上述两个示例都用于tail -n 1仅打印排序输出的最后一行ls。然而,解析ls是一个非常糟糕的想法通常应避免使用。以下是一些更复杂但更安全的方法,可以处理任意文件名:

  • 这使用了一些技巧,我需要使用{ }语法来捕获变量(参见这里)。IFS=-r确保我们可以处理奇怪的文件名,并stat获取文件的修改时间。最新的文件保存在变量中$newest

    mdate=0; 
    fdate=0;
    newest=$(find . -type f -exec grep -Hl foo {} \; | 
    { 
        while IFS= read -r file; do 
            fdate=$(stat -c %Y "$file"); 
            if [ "$fdate" -gt "$mdate" ]; then 
                latest="$file"; 
                mdate="$fdate"; 
            fi; 
        done; 
        echo "$latest"; 
    })
    

相关内容