2013-05-31 67 views
0

我想弄清楚我將如何搜索多個目錄,使用pushd定義,以便找到列表中的文件夾的磁盤空間,以及是否有任何文件夾是sym鏈接。現在我有一些非常低效的循環,不能在多個目錄中工作(如果只有一個目錄,它可以正常工作,但是一旦我開始用pushd定義多個工作目錄,它就會將其分解)。通過在bash中的多個目錄搜索

UPDATE:在執行時,它

COMPARE=`comm -23 "$HOMEOUT" "$USEROUT" | 
      comm -23 - <(
       for f in "${FILTER[@]}"; do 
        echo "$f" 
       done | sort)` 

這裏是我的代碼和我的結果:

的$內容對比參考

DIRS=`ls -lah/| grep home | awk '{ print $9 }'` 

for i in "$DIRS"; do 
    pushd /$i/ >/dev/null 
done 

# Find the disk space of each folder 

for x in "$DIRS"; do 
     du -s /$x/$COMPARE | sort -n | cut -f 2-|xargs -i du -sh {} 
done 


# Check for and output symlinks 
SYM=`for y in "$COMPARE"; do 
    find /$DIRS/$y -maxdepth 1 -type l -print 
done` 

結果:

+ DIRS='home 
home2 
home3 
old_home' 
+ for i in '"$DIRS"' 
+ pushd /home home2 home3 old_home/ 
+ for x in '"$DIRS"' 
+ sort -n 
+ du -s /home home2 home3 old_home/someuser someuser2 someuser3 someuser4 
+ cut -f 2- 
+ xargs -i du -sh '{}' 

正如你所看到的,這是行不通的,因爲我希望它通過每個用戶在列表中,像這樣搜索(取決於他們的文件夾所在):

/home/user中 /家/ user2 /home2/user3 /home3/user4

有人可以建議一個更好/更有效的方法來做到這一點,實際工作嗎?我想弄清楚我是如何能夠整體壓縮這一點的。

猛砸版本:

GNU的bash,版本3.2.25(1)-release-下(x86_64-紅帽Linux的GNU的)

提前感謝!

+1

你爲什麼要推的目錄,以目錄棧?另外,不需要創建一個'DIRS'變量;只需在'/ home/*中使用'for i;做' – chepner

+0

這似乎是在bash腳本中有多個工作目錄的最好方法,因爲我想搜索服務器上找到的任何/ home *目錄。如果情況並非如此,我願意以更好的方式來做到這一點。 – Striketh

+0

目錄堆棧僅僅使它更容易切換到以前使用的工作目錄;一次只有一個工作目錄。你永遠不會使用堆棧,因爲你永遠不會調用'cd'或'popd'。但是,您也永遠不會使用工作目錄,因爲您始終將目錄作爲顯式參數傳遞給'du'和'find'。 – chepner

回答

1

"$DIRS"將展開爲"home home2 ...",因此for將會將其視爲單個令牌。並且不要分析ls,它非常脆弱。用途:

for x in /*home*; do 
    du -sh "$x" | sort -h 
done 

(注意:sort -h是GNU擴展,但你在RedHat,你應該有它)。
你還沒有向我們展示瞭如何構建$COMPARE,但我認爲你在尋找它來代替第二循環:

find /*home*/* -maxdepth 1 -type l 

如果你只想要一些用戶,你必須告訴我們如何你構造了$COMPARE;你可能想要將它製成一個數組並使用find /*home*/"${COMPARE[@]}" ...


構建COMPARE通過()包裹它是一個數組。

IFS=$'\n' COMPARE=($(comm -23 "$HOMEOUT" "$USEROUT" | 
      comm -23 - <(printf "%s\n" "${FILTER[@]}" | sort)) 

,並使用它:

find /*home*/"${COMPARE[@]}" -maxdepth 1 -type l 
+0

+1強調[不解析ls](http://mywiki.wooledge.org/ParsingLs) – msw

+0

我更新了我的問題,以便您更清楚地瞭解$ COMPARE發生了什麼。 – Striketh

+0

IFS在結果中出現亂碼路徑,例如:/ home/i'oforg - 並且COMPARE中的​​修改代碼在我的shell中不起作用。另外,sort -h不被識別。不過,我至少在正確的軌道上。 – Striketh