我不会每天在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
我的问题是:如何避免这种情况?
答案 0 :(得分:1)
您需要在find中使用-prune
开关。
这是一个例子(我在stackoverflow上发现了这个)
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
这省略了dir1
,dir2
,dir3
。
答案 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