2015-02-06 92 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