保护输入以bash为具有奇数字符和单引号的目录

时间:2014-09-30 17:41:48

标签: bash

我正在努力保护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但是在任一方向堆叠引号都没有帮助。

3 个答案:

答案 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