2011-04-21 104 views
0

有一个问题,试图让一个bash脚本从一个文件中读取IP地址和用户名,该文件在windows上挂载到该共享,然后将ano文件类型复制到一个新文件夹中称为用户名称。 目前它不太有效,它会创建数百个名为* .ano的文件夹,如果它无法找到Windows共享。用于从多台Windows机器复制文件的Linux脚本

请帮助

文本文件:

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

的问题是在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跳过文件中的任何可能的空行。

+0

大家好,感谢这么快的回复大家好,感谢这么快的回复,我改变了代码如下,但仍然得到多个文件我在这里做了一些错误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;执行 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 – Grimlockz 2011-04-21 09:46:57

+0

@pepoluan感谢您的帮助,我已经更改了代码,但仍然得到多个文件,我在这里做了一些错误: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;做 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 ' – Grimlockz 2011-04-21 10:46:37

+0

@Grimlockz如果挂载失败,则不能rsync;在'mount'行后面加'&&'(空格和)。 '&&'意味着只有当最后一个命令返回'0'时(这在* nix世界中意味着成功)才执行下一个命令*。另外,你可以放置第2行和第3行(带'grep'和'awk'的行);他们不再需要了。 – pepoluan 2011-04-21 13:59:15

0

一个问题是,您使用通配符(*)作为目标文件。但这些文件不存在 - 因此/home/user/Documents/$USERNAME/*.ano无法匹配,rsync将创建一个文件*.log

做的更好:

rsync -va /home/user/$USERNAME/*.ano /home/user/Documents/$USERNAME/ 
相关问题