一次性列出 12* 和 13* 系列的文件

一次性列出 12* 和 13* 系列的文件

您好,我有以 ABC1*、ABC12* 和 ABC13* ABC14* 系列等系列开头的文件列表...

我想用 find 命令获取 ABC12* 和 ABC13* 的列表

我正在使用以下命令,但无法提取准确的结果..

ls -ltr |grep -e "ABC12" |find . -type f -mtime 15

答案1

-name选项搜索模式。方括号的意思是 OR 里面的内容。

find . -type f -name  'ABC1[23]*'

答案2

注意这-mtime 15意味着“其年龄向上舍入到下一个 24 小时单位是 15”,即14*24几小时前和15*24几小时前修改的文件(请注意,我们不是在谈论与许多时区一样,这里每年有一个 23 小时的日子和一个 25 小时的日子)。假设这就是你想要的,使用zsh,你可以这样做:

ls -lrtd -- **/ABC1[23](D.m15)

或者:

find . -type f -name 'ABC1[23]' -mtime 15 -exec ls -lrtd {} +

但请注意,如果文件数量超过传递给命令的参数和环境的最大大小,第一个文件将失败,而第二个文件将导致ls运行多个实例,因此列表不按请求的时间顺序排列和-t

使用zshGNU ls,您可以通过以下方式解决这个问题:

autoload zargs
zargs -- **/ABC1[23](D.m15Om) -- ls -lUd

也就是说,让我们进行排序,并根据需要zsh将列表传递给一个或多个调用,但告诉不要对列表进行排序。对于其他实现,您可以将 替换为,让它进行另一次无用但无害的排序。lslslsUrt

ABC17如果你想要一个像->这样的范围,ABC23而不仅仅是ABC12, ABC13, with zsh,你会这样做:

ls -lrtd -- **/ABC<17-23>(D.m15)

(但请注意,ABC<17-23>匹配ABC17但也匹配ABC0000017。如果这是一个问题,请更改<17-23>(<17-23>~^??)(尽管 glob 运算extendedglob符需要选项pattern~exclude)以确保它仅匹配 2 位数字或(<17-23>~0*)排除前导 0 的数字)。

如果是文件名开始ABC12相对于 ABC12,那么你会做

ls -lrtd -- **/ABC<17-23>*(D.m15)

但请注意,这也将在 ABC170 上匹配。为了避免这种情况:

setopt extendedglob
ls -lrtd -- **/ABC<17-23>^[0-9]*(D.m15)

也就是说,<17-23>后面跟的不是以十进制数字开头的任何内容。

等效find的(尽管不允许前导零并且对于大量文件存在上述问题,并且如果文件名包含无效字符则存在潜在问题,并且./所有文件上都有前缀)有时会像这样:

find . \( -name 'ABC1[7-9]*' -o -name 'ABC2[0-3]*' \) \
       ! -name 'ABC??[0-9]*' -mtime 15 -type f \
      -exec ls -lrtd {} +

相关内容