假设我有一个名为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
我确信我犯了一些重大错误(比如尝试将字符串复制到字符串中,但我不知道如何找到实际文件和副本的路径)
答案 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
,你可以自己决定你是否愿意)