如何将源文件复制到目标文件中?

时间:2015-09-12 21:34:01

标签: bash

假设我有一个名为blabla.txt的文件,如下所示:

blabla.php <usb>blabla /bla/bla
blabla.js  <usb>blabla /bla/bla

我想编写脚本来检查blabla.php,blabla.js是否存在, 一个接一个,如果字符串存在,将使用path将目标文件的路径复制到源文件并替换源而不是目标文件。

源路径为:

 <usb>blabla

目标路径为:

/bla/bla

所以我第一次接触bash脚本,如果你试着在初学者级别为我解释它,我会很感激,直到现在我都试过这个(也有点伪代码):

while read line; do
for filename in $line; do
if grep -Fxq "$filename" blabla.txt
cp $filename+1 $filename+2
done
done

我确信我犯了一些重大错误(比如尝试将字符串复制到字符串中,但我不知道如何找到实际文件和副本的路径)

2 个答案:

答案 0 :(得分:2)

您应该将文件的每一列读取到代表其角色的另一个变量中。

while read -r filename sourcedir destdir
do
    if [[ -e "$sourcedir/$filename" ]]
    then 
        cp "$sourcedir/$filename" "$destdir"
    fi
done < inputfile

答案 1 :(得分:1)

假设文件中的空格将重要字段分开并且永远不是名称的一部分,那么您可以执行以下操作:

while read file source target junk
do
    if [ -n "$junk" ]
    then echo "Unexpected junk at end of line: $file $source $target $junk"
    elif [ -f "$source/$file" ]
    then
        [ -d "$target" ] || mkdir -p "$target" || exit 1
        cp "$source/$file" "$target/$file" || exit 1
    else
        echo "No such file: $source/$file" >&2
    fi
done < blabla.txt

您想要做的事情的描述并不是那么清楚。

此代码将blabla.txt的每一行读入4个变量,在空格上分割。这是read的一个非常有用的功能。然后代码检查该行上最多有3个字段。如果有额外信息,它将存储在$junk; -n测试检查$junk是否为非空,如果是,则忽略该行。如果源文件存在(并且是文件),则代码确保目标目录存在(如果不存在则创建它,如果无法创建它则退出),然后将源文件复制到目标目录(如果有问题退出)。如果源文件不存在,则报告问题。

您可以通过多种方式调整此项,具体取决于您真正想要做的事情。如果目录创建有问题,或者复制失败,您可以决定不退出但继续下一行。但是,一旦复制失败,其余部分也可能会失败。例如:

    if [ -d "$target" ] || mkdir -p "$target"
    then cp "$source/$file" "$target/$file"
    fi

您可以考虑使用read -r …;我没有,但我不介意'生活危险'(但这里的爱好者更喜欢你使用它,所以你被告知你可以使用-r,你可以自己决定你是否愿意)