2009-10-08 37 views
0

我最什麼,我需要到目前爲止,我只是不確定grep命令只得到目錄或如果沒有一個。對於上下文,這是原來的請求:打印出來的文件名稱和(BASH)

該腳本應採取這將是到目錄的路徑的單個命令行參數。 (完成)腳本應確保該路徑實際上是一個目錄,並且該用戶對其有讀取權限。 (完成)你的程序應該捕獲目錄上的ls命令的輸出。 (完成)它應該打印出只有找到的子目錄的名稱。文件應該被忽略。 (???)

我到目前爲止有:

#!/bin/bash 

if [ -d $1 ] && [ -r $1 ] ; then 
    ls -l $1 | tee output | grep ______ 
fi 

回答

7

做的grep

ls -l | grep '^d' 

或只使用發現

find $1 -type d 
+0

THANKs這個完美的作品 – roger34 2009-10-08 01:28:51

+1

+1查找。 'find'是遞歸的,儘管如此,它可能不會是所期望的。 – strager 2009-10-08 02:57:16

+0

您可以控制遞歸。看安迪羅斯的回答。 – 2009-10-08 03:05:34

1

-p選項ls可能是有用的。見man ls

2

提示—從man ls

-F ...顯示一個斜槓(/)每個路徑名後這是一個目錄,星號(*)之後的每個,每個後是可執行的,一個在每個符號鏈接後符號(@),一個等於每個插座後符號(=),每個白化後百分號(%)和豎直條(|),其是一個FIFO。

-p ...如果該文件是目錄,則在每個文件名後面寫一個斜槓(/)。

0

ls -l . | awk '/^d/{printf "%s ",$8}' 

儘管這些說法$8取決於ls -l輸出在你的機器

+0

是的,特別是如果有空格的文件。 8美元是不夠的。 – ghostdog74 2009-10-08 02:26:38

1
find $1 -maxdepth 1 -type d 

也是行之有效的。如果上述罪名awk的例子,你可能也包括Perl的:在陣列上下文中調用時

grep -d, glob("$path/*") 

......將讓你的目錄列表。

+0

有人可能也想使用-mindepth 1。 – 2009-10-08 12:27:21

1

ls是 「眼睛只」

參見:Parsing ls

find是正確的命令來使用。見安迪·羅斯的答案。

0

你可能不需要-d或-r檢查:

shopt -s failglob 
echo "$1"/*/. 

更換回聲你真的想這樣做(你原來的問題不說了)的東西。