bash 在脚本中查找 exec cp 父母

bash 在脚本中查找 exec cp 父母

我正在尝试运行这个命令

for c in ax
do
mkdir $TgtDir$c/$Date
cd $TgtDir$c/$DirNew
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo $DIR
echo find . -iname $tgt -exec cp --parents {} ../$Date \;
find . -iname $tgt -exec cp --parents {} ../$Date \;
done

它打印

/home/ax/new
find . -iname '*20170829*' -exec cp --parents {} ../20170829 ;

但不复制任何东西。如果我从新目录运行此处回显的命令(在末尾添加 \ 之后,似乎 echo 正在吞下它作为转义),它工作正常 - 并且文件被复制到 /home/ax/20170829/ ....

我在这里缺少什么想法吗?

答案1

我猜你并不真正在目录 DIR 中;您cd在子 shell 中执行,但其余命令的工作目录仍位于$TgtDir$c/$DirNew.您可以通过调用pwdafter来验证这一点echo $DIR

解决方案:直接调用cd,不要使用子shell或将结果分配给变量。将绝对目标路径添加到复制命令中。

for c in ax
do
    mkdir $TgtDir$c/$Date

    DIR=$( dirname "${BASH_SOURCE[0]}" )
    cd "${DIR}"
    pwd

    find . -iname $tgt -exec cp --parents {} $TgtDir$c/$Date \;
done

替代方案:使用源目录而不是“.”在查找命令中。

for c in ax
do
    mkdir $TgtDir$c/$Date
    cd $TgtDir$c/$DirNew

    DIR=$( dirname "${BASH_SOURCE[0]}" )
    find "${DIR}" -iname $tgt -exec cp --parents {} ../$Date \;
done

注意:代码未经测试。

相关内容