我正在使用终端中的功能搜索过去一天编辑过的文件find . -type f -mtime 0
。我想在查询中排除一些文件和文件夹,例如.DS_Store
文件和.sh
文件。
目前我正在这样做:
find . -type f -not -path "*.DS_Store" -and -not -path "*.sh" -mtime 0
我还有很多文件想要排除,我想知道是否可以缩短表达式。我不想写成:
-not -path "PathHere" -and -not -path "AnotherPathHere"
等等。
有什么建议么?
答案1
-and
无论如何都是多余的,所以您可以简单地删除它,并且!
可以代替非标准-not
运算符使用。您可以使用 bash 数组列出每行一个排除项。不会短很多,但更易于阅读和编辑。
filters=(
! -name '*.DS_Store'
! -name '*.sh'
! -name '*.bash'
)
find . -type f \( "${filters[@]}" \) -print
扩展上述方法还可以避免进入某些目录,方法是使用-prune
:
filters=(
! -name '*.DS_Store'
! -name '*.sh'
! -name '*.bash'
)
prune_dirs=(
-name '*.tmp'
-o -name 'tmp'
-o -name '.Trash*'
)
find . -type d \( "${prune_dirs[@]}" \) -prune -o -type f \( "${filters[@]}" \) -print
答案2
您可以使用标准 Bash 模式匹配,或者通配符因此,您可以使用选项-iname
(不区分大小写的名称搜索)并将!
其用作“not”运算符,因此对于您提出的情况:
find . -type f \( ! -iname ".DS_Store" ! -iname "*.sh" \) -mtime 0