您好,我有以 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
。
使用zsh
GNU ls
,您可以通过以下方式解决这个问题:
autoload zargs
zargs -- **/ABC1[23](D.m15Om) -- ls -lUd
也就是说,让我们进行排序,并根据需要zsh
将列表传递给一个或多个调用,但告诉不要对列表进行排序。对于其他实现,您可以将 替换为,让它进行另一次无用但无害的排序。ls
ls
ls
U
rt
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 {} +