用于从多台Windows机器复制文件的Linux脚本

时间:2011-04-21 08:14:29

标签: linux bash rsync smb

尝试制作一个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

2 个答案:

答案 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以跳过文件中任何可能的空白行。