我正在努力保护bash / rsync脚本的一些输入。总之,我正在尝试浏览一些目录的rsync,而我遇到的问题是某些目录可能有奇怪的字符,如$
符号,而其他目录有单引号'
。
我发现如果用""
保护输入中的变量,那么$ABC
目录得到保护并正确处理,但是带有单引号的目录却没有。相反,如果我使用单引号保护它们,则$ABC
会失败,但带有单引号的目录会起作用。
我尝试以不同的方式在我的变量周围堆叠引号和单引号,但在每种情况下都有不同的错误,我无法使用相同的解决方案来满足输入流中的变量和单引号。 / p>
以下是我正在使用的代码段:
cd $SRCDIR; find . -type d -print0 | xargs -0 -n1 -P$THREADS -I {} bash -c 'echo $TARGETDIR/"'{}'"; mkdir -p $TARGETDIR/"'{}'"; rsync -lptgoDdvXsz "'{}'"/ $TARGETDIR/"'{}'"'
在此配置中,它传输具有单引号的目录,例如:
/data/here's my photos/
但不会转移内容:
/data/$ABC
如果我扭转单引号和双引号,我会得到相反的行为,但我很难让两者都起作用。
我检查了这个帖子:Problems with single quotes in a bash script但是在任一方向堆叠引号都没有帮助。
答案 0 :(得分:0)
因为xargs
会取代{}
本身,所以不需要将它们排除在引号之外;以下是相同的,但更容易遵循。 (并且,正如Etan所指出的,最好让生成的脚本接受来自xargs
的字符串作为参数,而不是在脚本本身中包含{}
。
cd $SRCDIR
find . -type d -print0 |
xargs -0 -n1 -P$THREADS bash -c '
echo "$TARGETDIR/$1"
mkdir -p "$TARGETDIR/$1"
rsync -lptgoDdvXsz "$1/" "$TARGETDIR/$1"' -
现在,由于bash
命令将逐字地获取$TARGETDIR
(因为它在单引号内),只需确保将变量导出到具有冗余的bash
命令的环境中 - 找
TARGETDIR=$TARGETDIR xargs -0 -n1 ...
这会设置TARGETDIR
将在其中运行的xargs
的值,该值由每个最终调用bash
继承。
我通常的建议是:如果你使用的是bash
4,请跳过find
并使用一个利用globstar运算符的for循环。它会更有效率,因为您不需要为每个目录启动bash
的新实例,而且**/*
的shell扩展不应该比使用find
的效率低得多
shopt -s globstar nullglob
for d in "$SRCDIR"/**/*/; do
echo "$TARGETDIR/$d"
mkdir -p "$TARGETDIR/$d"
rsync -lptgoDdvXsz "$d/" "$TARGETDIR/$d"
done
答案 1 :(得分:0)
试试这个:
escapedFilename=$(printf '%q' "$filename")
答案 2 :(得分:0)
这不是一种保护方法,但您可以根据'
的存在来执行这两个命令。这可能不如上面的解决方案好,但逻辑很简单。
if [[ $ABC == *'* ]]
then
do the command for if there is a ';
else
do the command if there is not a ';
fi