2014-01-29 34 views
1

我需要做一個bash命令來查看系統上的每個主目錄,並將.forward文件的內容複製到一個文件中,以及複製剛剛複製的目錄的名稱。因此,例如最終文件將類似forwards.txt和聆聽將是Bash腳本掃描子目錄並將文件的內容複製到另一個文件

/home/user1 
[email protected] 
/home/user2 
[email protected] 

我已經用它來列出它們到屏幕上。

find /home -name '*' | cat /home/*/.forward 

它會打印出每個文件中的前進,但我沒有得到它前綴與它來自哪個主目錄。我需要使用循環來做到這一點嗎?我有這個測試循環,

#!/bin/bash 
for i in /home/* 
     do 
       if [ -d $i ] 
         then 
           pwd >> /tmp/forwards.txt 
           cat /home/*/.forward >> /tmp/forwards.txt 
       fi 
     done 

但它通過四個主目錄繼續我的測試設置和forwards.txt文件有以下列出的四倍。

/tmp 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

謝謝。腳本的

+0

這感覺就像find'的'的組合和'-exec'可以使這一個單線(頭向他的Bash shell提示...) –

回答

1

有修正版本:

#!/bin/bash 
for i in /home/* 
     do 
       if [ -f "$i/.forward" ] 
       then 
           echo "$i" >> /tmp/forwards.txt 
           cat "$i/.forward" >> /tmp/forwards.txt 
       fi 
     done 

幾點:

  • 我們檢查主目錄,而主目錄本身

  • 的存在內部.forward文件的禮物

    每次迭代$i包含主目錄的名稱(如/home/user1)。因此,我們使用它的值,而不是pwd命令的輸出總是返回當前目錄(它不我們的情況下改變)

  • ,而不是/home/*/.forward我們使用"/home/$i/.forward"因爲*置換後給我們所有的目錄,而我們需要目前唯一的


另外,這個腳本的最短的版本可能看起來像這樣:

find /home -type f -name '.forward' | while read F; do 
    dirname "$F" >>/tmp/forwards.txt 
    cat "$F" >>/tmp/forwards.txt 
done 
+0

感謝您的幫助。我輸入後很快意識到,回聲不是pwd就是我想要做的。有一件事,我不得不將/home/$i/.forwards改爲$ i/.forward – AaronW

0

甲一個襯裏(校正):

find /home -maxdepth 2 -name ".forward" -exec echo "{}" >> /tmp/forwards.txt \; -exec cat "{}" >> /tmp/forwards.txt \; 

這將輸出:

/home/user1/.forward 
[email protected] 
[email protected] 
/home/user2/.forward 
[email protected] 
+0

唯一沒有做的是當前目錄的回顯。 – AaronW

+0

感謝您的幫助。 – AaronW

1

我會寫

for fwd in /home/*/.forward; do 
    dirname "$fwd" 
    cat "$fwd" 
done > forwards.txt 
相關問題