【问题标题】:Linux script for copying files from multiple windows machines用于从多台 Windows 机器复制文件的 Linux 脚本
【发布时间】:2011-04-21 08:14:28
【问题描述】:

在尝试制作一个 bash 脚本时遇到问题,该脚本将从一个文件中读取 IP 地址和用户名,该文件在 Windows 上挂载到该共享的连接,然后将一个文件类型复制到一个名为用户名的新文件夹中。 目前它还不能正常工作,如果找不到 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

【问题讨论】:

    标签: linux bash rsync smb


    【解决方案1】:

    问题出在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 ]] &amp;&amp; continue 以跳过文件中任何可能的空行。

    【讨论】:

    • 大家好,谢谢这么快的回复大家好,谢谢这么快的回复,我已经将代码更改如下,但仍然得到多个文件我在这里做错了什么 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/ 完成
    • @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; 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 &lt; $USER
    • @Grimlockz 如果挂载失败,您不能 rsync;在mount 行后面添加`&&`(空格和和)。 &amp;&amp; 表示仅当最后一个命令返回0 时才执行下一个命令(在 *nix 世界中,这意味着成功)。另外,您可以删除第 2 行和第 3 行(带有grepawk 的行);他们不再需要了。
    • USER='/home/billy/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/billy/Documents/$USERNAME mount &&` -t smbfs //$IPADDY/$USERNAME /home/billy/$USERNAME cp /home/billy/$USERNAME/*.ano /home/billy/Documents/$ USERNAME/done
    • @pepoluan USER='/home/billy/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) IPADDY=$USER USERNAME=$USER while read IPADDY USERNAME; do ' &amp;&amp;' mkdir /home/billy/Documents/$USERNAME mount -t smbfs //$IPADDY/$USERNAME /home/billy/$USERNAME ' &amp;&amp;' rsync -va /home/billy/$USERNAME/ /home/billy/Documents/$USERNAME/ done &lt; $USER 我想我越来越近了,现在正在复制文件,现在唯一的问题是如果安装存在我必须输入密码
    【解决方案2】:

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

    最好这样做:

    rsync -va /home/user/$USERNAME/*.ano /home/user/Documents/$USERNAME/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多