给定两个模式,搜索特定目录并打印与每个模式匹配的最后三个文件名

给定两个模式,搜索特定目录并打印与每个模式匹配的最后三个文件名

我怎样才能缩短这个命令?目标是显示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

-aisfind的布尔 AND 运算符。

对于 BSD find,请使用-orand-and而不是-oand -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

相关内容