尝试制作一个bash脚本时会出现问题,该脚本将从一个文件中读取IP地址和用户名,该文件在Windows上挂载该共享的连接,然后将ano文件类型复制到一个名为users name的新文件夹中。 目前它不起作用,如果它找不到Windows共享,它会生成数百个名为* .ano的文件夹。
请帮助
文字档案:
192.168.0.2 user1
192.168.0.3 user2
bash脚本:
USER='/home/user/user.ip'
IPADDY=$(grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' $USER)
USERNAME=$(awk '{ print $NF }' $USER)
for i in $IPADDY $USERNAME
do
mkdir /home/user/Documents/$USERNAME
mount -t smbfs //$IPADDY/$USERNAME /home/user/$USERNAME
rsync -va /home/user/$USERNAME/*.ano /home/user/Documents/$USERNAME/*.ano
done
非常感谢您的快速回复,我已经更改了以下代码,但仍然得到多个文件我在这里做错了什么
USER='/home/user/user.ip'
IPADDY=$(grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' $USER)
USERNAME=$(awk '{ print $NF }' $USER)
while read IPADDY USERNAME; do
mkdir /home/user/Documents/$USERNAME
mount -t smbfs //$IPADDY/$USERNAME /home/user/$USERNAME
rsync -va /home/user/$USERNAME/*.ano /home/user/Documents/$USERNAME/
done < $USER
答案 0 :(得分:0)
一个问题是您使用通配符(*
)作为目标文件。但这些文件不存在 - 因此/home/user/Documents/$USERNAME/*.ano
无法匹配,rsync将创建文件*.log
。
更好:
rsync -va /home/user/$USERNAME/*.ano /home/user/Documents/$USERNAME/
答案 1 :(得分:0)
问题出在for
命令中。在您的脚本中,i
遍历$ IPADDY的内容,然后然后迭代$ USERNAME的内容。同时,循环内的$ USERNAME扩展为user1 user2
,结果为:
mkdir /home/user/Documents/user1 user2
装载线变为:
mount -t smbfs //192.168.0.2 192.168.0.3/user1 user2 /home/user/user1 user2
等等。
相反,循环遍历文件本身:
while read IPADDY USERNAME; do
#awesome things here based on $IPADDY and $USERNAME
done < $USER
您可能希望添加[[ -z $IPADDY ]] && continue
以跳过文件中任何可能的空白行。