![给定两个模式,搜索特定目录并打印与每个模式匹配的最后三个文件名](https://linux22.com/image/138366/%E7%BB%99%E5%AE%9A%E4%B8%A4%E4%B8%AA%E6%A8%A1%E5%BC%8F%EF%BC%8C%E6%90%9C%E7%B4%A2%E7%89%B9%E5%AE%9A%E7%9B%AE%E5%BD%95%E5%B9%B6%E6%89%93%E5%8D%B0%E4%B8%8E%E6%AF%8F%E4%B8%AA%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%89%E4%B8%AA%E6%96%87%E4%BB%B6%E5%90%8D.png)
我怎样才能缩短这个命令?目标是显示ABC
文件夹中且uvw
文件名匹配的最新 3 个文件,然后执行相同但xyz
文件名匹配的操作。
我希望缩短这个长度,因为将来需要添加更多字符串来查找。
find . -name 'ABC' | xargs ls | grep -i uvw |sort| tail -n 3; find . -name 'ABC' | xargs ls | grep -i xyz |sort| tail -n 3
输出示例:
2018-06-23T01-23-56.919Z-UVW.gz
2018-06-23T01-29-56.556Z-UVW.gz
2018-06-23T23-26-14.463Z-UVW.gz
2018-08-08T00-16-22.923Z-xyz.js
2018-08-08T00-16-24.517Z-xyz.js
2018-08-08T00-16-25.427Z-xyz.js
答案1
和zsh
:
set -o extendedglob # best in ~/.zshrc
for w (uvw xyz) printf '%s\n' **/ABC/(#i)*$w*(D[-3,-1]:t)
**/
:任何级别的子目录(#i)
: 不区分大小写匹配以下内容(D[-3,-1]:t)
: 全局限定符D
:包含隐藏文件并查看隐藏目录,find
就像[-3,-1]
:仅选择最后 3 个(默认情况下,glob 按词法顺序排序):t
:修饰语提取的尾巴像您一样的文件路径(基本名称)ls
。
请注意,如果有多个 ABC 目录,这些目录的名称将影响排序( 中的文件a/ABC
将出现在 中的文件之前b/ABC
)。
答案2
这将搜索匹配的任何文件任何这些片段:
for fragment in ABC UVW xyz; do
find . -name "\*${fragment}\*" | sort | tail -n3;
done
如果你想找到匹配的文件全部其中,你可以这样做:
find . -name '*ABC*' -a -name '*xyz*' | sort | tail -n3
-a
isfind
的布尔 AND 运算符。
对于 BSD find
,请使用-or
and-and
而不是-o
and -a
。
答案3
您很可能正在寻找
find . -iregex '.*/ABC/[^/]*uvw.*' | sort | tail -n3
它的工作原理如下:
-iregex
不区分大小写模式搜索.*/ABC/
在任意深度查找目录 ABC(dir 的全名)[^/]*uvw.*
dir 的名称ABC
后面直接跟一个包含uvw
字符串的文件名,而不是中间的任何子目录
和sort
部分tail
未受影响。
至于添加其他模式:您需要使用所有需要的字符串对此命令进行循环,或者如果您只需要 3 个文件,无论它们来自哪一组,您可以将所有内容合并到一个命令中:
find . -iregex '.*/ABC/[^/]*\(uvw\|xyz\)[^/]*' | sort | tail -n3
答案4
我在 bash 脚本中通过 for 循环得到了所需的内容,是否可以在命令行中执行此操作?
#!/bin/bash
for i in ABC DEF
do
for j in uvw xyz
do
x=`find . -iname $i | xargs ls | grep -i $j | sort | tail -n 3`
echo "$x"
done
done