2011-04-21 105 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/ 
相關問題