2015-02-06 51 views
0

我正在嘗試編寫一個腳本shell,它將兩個參數作爲目錄名稱,並確定目錄1是否包含目錄2,反之亦然。而且如果他們之間沒有關係。在Linux中檢查目錄

我知道命令來檢查一個目錄是否存在find -type d,但是我有點困惑如何檢查和解析名稱。我知道我會需要if-else循環,只是不知道如何檢查條件?

+2

檢查一個目錄是否存在就是'if [[-d dirname]]'。你寫的東西('find -type d')是*查找「目錄」*類型的所有項目,你仍然需要檢查結果。 – DevSolar 2015-02-06 07:41:53

+0

如何檢查一個目錄是否包含另一個目錄? – chillax786 2015-02-06 07:53:45

+0

您是否考慮只解析名稱,還是想考慮符號鏈接?如果部分路徑包含符號鏈接,則很難。 (但應該仍然有可能)。 – 2015-02-06 07:56:02

回答

1

這也有問題,我認爲,

find -name directory1 |grep directory2 

或反之亦然,然後用

echo $? 

它會給失敗0成功和1

+1

我喜歡這個答案。它將與@ DevSolar的評論一起工作。 – 2015-02-06 08:07:16

+0

謝謝@purplehuman – Skynet 2015-02-06 08:08:18

3

find將不需要。 東西與此類似(但不保證用空格或一些特殊字符的目錄名。):

if [ "$dir1" == "$dir2" ]; then 
    echo "$dir1 == $dir2"; 
    exit; 
fi 
if grep -E -q "^$dir2" <<< $dir1; then 
    echo "$dir1 is contained by $dir2." 
    exit 
fi 
if grep -E -q "^$dir1" <<< $dir2; then 
    echo "$dir2 is contained by $dir1."; 
fi 

然而,這不處理符號鏈接。例如,sym1 -> /usr/local/binsym2 -> /usr/local,顯然sym2包含sym1

此外,這不對付奇形怪狀的目錄名,像/usr/local/./bin,這是一樣的/usr/local/bin,甚至/usr/local/../bin,這是一樣的/usr/bin

---更新--- DevSolar提到可以使用readlink -e來解析符號鏈接。在我的測試中,它還解決了像...那些奇怪的目錄名稱。感謝DevSolar。

+0

不要像這樣使用'grep'。相反,使用'grep'和'-q'開關作爲'if'的參數:'if grep -E -q「^ $ dir1」<<<「$ dir2」; then'。現在,如果目錄名稱包含特殊字符(如'''',''','('等)),那麼你的整個方法就有缺陷了。我肯定不會推薦這樣做。事實上,更好的方法來檢查沒有外部工具的子字符串:'if [[$ dir1 =「$ dir2」*]];然後'好得多。 – 2015-02-06 15:07:25

+0

''grep''很高興知道'-q'選項。知道'如果grep'好,我通常使用它。我剛被別人的'$?'答覆刻板。 :-)我現在將編輯答案。 – 2015-02-09 02:01:07

+0

@gniourf_gnirourf至於你的if [[$ dir1 =「$ dir2」*]]',我相信這是一個更好的答案,你應該把它作爲一個新的答案。我不會改變我的。 – 2015-02-09 02:02:50

2

你想要這個嗎?


if [ -d $1 ];then 
    a=`find $1 -type d -name $2` 
    if [ $a ];then 
     echo "$1 has $2" 
    else 
     echo "$1 does NOT has $2" 
    fi 
fi 

if [ -d $2 ];then 
    b=`find $2 -type d -name $1` 
    if [ $b ];then 
     echo "$2 has $1" 
    else 
     echo "$2 does NOT has $1" 
    fi 
fi