不按shell扩展星号 - 不包括find中的路径

时间:2013-11-21 13:57:09

标签: bash shell find

我不会每天在Bash中编码。我正在尝试实现小功能:用户在find命令中定义要忽略的目录或文件数组。不幸的是,我遇到了通过shell扩展星号和其他元字符的问题(*在连接期间展开)。我的代码是:

excluded=( "subdirectory/a/*" 
        "subdirectory/b/*" 
        )

cnt=0
for i in "${excluded[@]}"; do
    directories="$directories ! -path \"./${excluded[$cnt]}\""
    cnt=$(($cnt+1))
done
echo "$directories"

for i in $(find . -type f -name "*.txt" $directories); do
    new_path=$(echo "$i"|sed "s/\.\//..\/up\//g")
    echo $new_path
done

不幸的是,我仍然在结果中看到排除的目录。

编辑:

这与现有问题不重复。我不会问你如何在find中排除目录。我通过将变量传递给find命令来扩展像“*”这样的元字符有问题。例如,我在下面有几乎可行的解决方案:

excluded=( "subdirectory/a/*" 
            "subdirectory/b/*"
            )

cnt=0
for i in "${excluded[@]}"; do
    directories="$directories ! -path ./${excluded[$cnt]}"
    cnt=$(($cnt+1))
done
echo "$directories"

for i in $(find . -type f -name "*.txt" $directories); do
    new_path=$(echo "$i"|sed "s/\.\//..\/up\//g")
    echo $new_path
done

它有效,但问题是例如目录c包含多个文件。在这种情况下,星号符号将被完整文件路径替换。因此我有一个错误:

find: paths must precede expression: ./subdirectory/c/fgo.txt
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec]   [path...] [expression]

为什么呢?因为星号sgin已扩展为完整文件名:

! -path ./subdirectory/a/aaa.txt ! -path ./subdirectory/b/dfdji.txt ! -path ./subdirectory/c/asd.txt ./subdirectory/c/fgo.txt

我的问题是:如何避免这种情况?

2 个答案:

答案 0 :(得分:1)

您需要在find中使用-prune开关。

这是一个例子(我在stackoverflow上发现了这个)

find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print

这省略了dir1dir2dir3

来源:https://stackoverflow.com/a/4210072/1220089

答案 1 :(得分:0)

我最初的想法是使用双引号来阻止扩展:

for i in $(find . -type f -name "*.txt" "$directories" | sed 's@\./@\.\./up/@g'); do

但这当然失败了。您可以使用(未​​经测试)完成相同的效果:

pre='! -path'
excluded=( "$pre subdirectory/a/*" 
           "$pre subdirectory/b/*"
            )

for i in $(find . -type f -name "*.txt" "${excluded[@]}" | sed ...); do