我遇到了一个有趣的问题。
我有一个找到特定内容的应用程序。它将从中获取内容 命令行作为排除列表。这是一个快速代码黑客来证明这个问题:
#! /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。
有没有办法做到这一点?
答案 0 :(得分:0)
不要将gen.exlude
与run.exclude
分开;在run.exclude
内构建一个包含数组。
run.exclude () {
local -a exclusions
for i in "$@"; do
exclusions+=( -not -path "*$i*" )
done
echo "find . ${exclusions[*]} -print"
find . "${exclusions[@]}" -print
}
对于某些参数,您记录的内容与您实际运行的内容不同,但您运行的内容将正确。