我想编写一个脚本,将 ID 作为用户的输入。根据该输入,它将搜索目录以匹配包含给定 ID 的文件。现在,该目录中有 10 多个文件,但所有文件都包含相同的 ID。因此,如果我使用grep
它,它只会按排序顺序显示文件。我不想显示所有文件,除了最新的目录中包含该 ID 的文件。假设我有、、、、、a1
等a2
文件。所有文件都有一些信息,但只有它们的 ID 不同。a3
a4
a5
a6
我试过了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"; })