在find命令行上插入排除项

时间:2018-05-22 17:54:56

标签: bash

我遇到了一个有趣的问题。

我有一个找到特定内容的应用程序。它将从中获取内容 命令行作为排除列表。这是一个快速代码黑客来证明这个问题:

#! /usr/bin/env bash

gen.exclude () {

    local i

    for i in "$@" ; do
        echo -n "-not -path *${i}* "
    done
}

run.find () {
    echo find . $(gen.exclude "$@") -print
    find . $(gen.exclude "$@") -print
}

rm -rf a
rm -rf b
mkdir a
mkdir b

echo "file 1a" >a/file1
echo "file 2a" >a/file2
echo "file 3a" >a/file3
echo "file 1b" >b/file1
echo "file 2b" >b/file2
echo "file 3b" >b/file3

cp -r "a" "b/a"

run.find '/a/'      # fails because of wild card expansion

在此示例中,为 / a / 创建了对-not -path * / a / *的排除。不幸的是,这会将外卡扩展为多个字符串并导致发现错误。

我可以在引号中包围被排除的内容,但之后它们会被视为排除字符串的一部分,这使得它成为一个noop。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

不要将gen.exluderun.exclude分开;在run.exclude内构建一个包含数组。

run.exclude () {
    local -a exclusions
    for i in "$@"; do
        exclusions+=( -not -path "*$i*" )
    done
    echo "find . ${exclusions[*]} -print"
    find . "${exclusions[@]}" -print
}

对于某些参数,您记录的内容与您实际运行的内容不同,但您运行的内容将正确