如何使用终端包含/排除许多不同的文件/文件夹

如何使用终端包含/排除许多不同的文件/文件夹

我正在使用终端中的功能搜索过去一天编辑过的文件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

相关内容