我正在嘗試編寫一個腳本shell,它將兩個參數作爲目錄名稱,並確定目錄1是否包含目錄2,反之亦然。而且如果他們之間沒有關係。在Linux中檢查目錄
我知道命令來檢查一個目錄是否存在find -type d,但是我有點困惑如何檢查和解析名稱。我知道我會需要if-else循環,只是不知道如何檢查條件?
我正在嘗試編寫一個腳本shell,它將兩個參數作爲目錄名稱,並確定目錄1是否包含目錄2,反之亦然。而且如果他們之間沒有關係。在Linux中檢查目錄
我知道命令來檢查一個目錄是否存在find -type d,但是我有點困惑如何檢查和解析名稱。我知道我會需要if-else循環,只是不知道如何檢查條件?
這也有問題,我認爲,
find -name directory1 |grep directory2
或反之亦然,然後用
echo $?
它會給失敗0
成功和1
。
我喜歡這個答案。它將與@ DevSolar的評論一起工作。 – 2015-02-06 08:07:16
謝謝@purplehuman – Skynet 2015-02-06 08:08:18
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/bin
和sym2 -> /usr/local
,顯然sym2
包含sym1
。
此外,這不對付奇形怪狀的目錄名,像/usr/local/./bin
,這是一樣的/usr/local/bin
,甚至/usr/local/../bin
,這是一樣的/usr/bin
---更新--- DevSolar提到可以使用readlink -e
來解析符號鏈接。在我的測試中,它還解決了像.
和..
那些奇怪的目錄名稱。感謝DevSolar。
不要像這樣使用'grep'。相反,使用'grep'和'-q'開關作爲'if'的參數:'if grep -E -q「^ $ dir1」<<<「$ dir2」; then'。現在,如果目錄名稱包含特殊字符(如'''',''','('等)),那麼你的整個方法就有缺陷了。我肯定不會推薦這樣做。事實上,更好的方法來檢查沒有外部工具的子字符串:'if [[$ dir1 =「$ dir2」*]];然後'好得多。 – 2015-02-06 15:07:25
''grep''很高興知道'-q'選項。知道'如果grep'好,我通常使用它。我剛被別人的'$?'答覆刻板。 :-)我現在將編輯答案。 – 2015-02-09 02:01:07
@gniourf_gnirourf至於你的if [[$ dir1 =「$ dir2」*]]',我相信這是一個更好的答案,你應該把它作爲一個新的答案。我不會改變我的。 – 2015-02-09 02:02:50
你想要這個嗎?
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
檢查一個目錄是否存在就是'if [[-d dirname]]'。你寫的東西('find -type d')是*查找「目錄」*類型的所有項目,你仍然需要檢查結果。 – DevSolar 2015-02-06 07:41:53
如何檢查一個目錄是否包含另一個目錄? – chillax786 2015-02-06 07:53:45
您是否考慮只解析名稱,還是想考慮符號鏈接?如果部分路徑包含符號鏈接,則很難。 (但應該仍然有可能)。 – 2015-02-06 07:56:02