Bash 查找包含字符串日期YYYY-MM-DD的标记文件,并按最近的日期对其进行排序

Bash 查找包含字符串日期YYYY-MM-DD的标记文件,并按最近的日期对其进行排序,bash,shell,Bash,Shell,我正在尝试查找包含(grep)字符串日期的标记文件YYYY-MM-DD并按最新的 for markdown in $(find content/note/ -type f \( -name "*.md" ! -name "index.md" \) -exec cat {} \; | grep -E '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}' | sort -rn); do echo $markdown done 但是不幸的是,$markdo

我正在尝试
查找
包含(
grep
)字符串日期的标记文件
YYYY-MM-DD
按最新的

for markdown in $(find content/note/ -type f \( -name "*.md" ! -name "index.md" \) -exec cat {} \; | grep -E '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}' | sort -rn); do
  echo $markdown
done
但是不幸的是,
$markdown
没有返回文件名,而是来自
grep
sort
命令的字符串

那么,如何进行排序,然后按降序返回文件名呢?

第一个问题:您说“某些文件”,但只搜索以.md结尾但与index.md不匹配的文件。这就是你在这里所说的“某些文件”吗

第二,谢谢你的提示(grep),但我没看到你在说什么

那么以下内容如何:

DIGIT=“[0-9]”
DATE_PATT=“$DIGIT$DIGIT$DIGIT$DIGIT-$DIGIT$DIGIT-$DIGIT$DIGIT-$DIGIT$DIGIT”
匹配的\u文件=$(查找。-name“*.md”\&!-name index.md)
xargs grep-c“$DATE_PATT”|
grep-v“:0$”|
sed“s/:[0-9]*$/”
)

请注意,“grep-c”每个文件只打印一行,即文件中有多少匹配项,随后的“grep-v”将丢弃计数为零的输出行,而“sed”将去掉冒号,并全部计数,并将空格分隔的文件名的结果列表分配给shell变量$MATCHING_FILES


还要注意,$DATE_PATT“必须被引用,否则,shell将检测到“[”并尝试展开以在当前目录中找到匹配的文件名。这根本不是我们想要的。被引用的“&”(我使用反斜杠来最大化丑陋性)也是如此。

谢谢您的回答。是的,某些文件意味着”以.md结尾但与index.md.不匹配的文件。如果您在我的代码块中水平滚动,您可以看到
grep-E'[[:digit:]{4}-[:digit:]{2}-[:digit:]{2}'
…您的意思是它什么都没做吗?