Bash 检查目录是否包含其他目录

Bash 检查目录是否包含其他目录,bash,shell,unix,Bash,Shell,Unix,如何检查给定目录在shell中是否包含另一个目录。我想传递2个完整路径目录。(我知道这很愚蠢,但只是为了学习)。然后我想看看这两条路径中是否有一条包含在另一条路径中 parent=$1 child=$2 if [ -d $child ]; then echo "YES" else echo "NO" fi 但是,这不使用父目录。仅检查子项是否存在。您可以使用find查看一个名称是否包含在另一个名称中: result=$(find "$parent" -type d -name

如何检查给定目录在shell中是否包含另一个目录。我想传递2个完整路径目录。(我知道这很愚蠢,但只是为了学习)。然后我想看看这两条路径中是否有一条包含在另一条路径中

parent=$1
child=$2

if [ -d $child ]; then
    echo "YES"
else
    echo "NO"
fi

但是,这不使用父目录。仅检查子项是否存在。

您可以使用
find
查看一个名称是否包含在另一个名称中:

result=$(find "$parent" -type d -name "$child")
if [[ -n $result ]]
then echo YES
else echo NO
fi

您可以在纯bash中实现这一点。循环遍历$1中的每个文件,查看“$1/$2”是否为dir,如下所示:

parent=$1
child=$(basename $2)
if [ -d $parent ] && [ -d $child ]; then
    for child in $parent; do
        if [ -d "$parent/$child" ]; then
            echo "Yes"
        else
            echo "No"
        fi
    done
fi
使用以下代码创建文件(例如:
dircontains.sh
):

#!/bin/bash

function dircontains_syntax {
    local msg=$1
    echo "${msg}" >&2
    echo "syntax: dircontains <parent> <file>" >&2
    return 1
}

function dircontains {
    local result=1
    local parent=""
    local parent_pwd=""
    local child=""
    local child_dir=""
    local child_pwd=""
    local curdir="$(pwd)"
    local v_aux=""

    # parameters checking
    if [ $# -ne 2 ]; then
        dircontains_syntax "exactly 2 parameters required"
        return 2
    fi
    parent="${1}"
    child="${2}"

    # exchange to absolute path
    parent="$(readlink -f "${parent}")"
    child="$(readlink -f "${child}")"
    dir_child="${child}"

    # direcory checking
    if [ ! -d "${parent}" ];  then
        dircontains_syntax "parent dir ${parent} not a directory or doesn't exist"
        return 2
    elif [ ! -e "${child}" ];  then
        dircontains_syntax "file ${child} not found"
        return 2
    elif [ ! -d "${child}" ];  then
        dir_child=`dirname "${child}"`
    fi

    # get directories from $(pwd)
    cd "${parent}"
    parent_pwd="$(pwd)"
    cd "${curdir}"  # to avoid errors due relative paths
    cd "${dir_child}"
    child_pwd="$(pwd)"

    # checking if is parent
    [ "${child_pwd:0:${#parent_pwd}}" = "${parent_pwd}" ] && result=0

    # return to current directory
    cd "${curdir}"
    return $result
}    
#/bin/bash
函数包含diru语法{
本地消息=$1
回显“${msg}”>&2
echo“语法:dircontains”>&2
返回1
}
函数dircontains{
局部结果=1
本地父项=“”
本地父项_pwd=“”
local child=“”
本地child_dir=“”
本地child_pwd=“”
本地curdir=“$(pwd)”
本地v_aux=“”
#参数检查
如果[$#-ne 2];则
Diru包含语法“恰好需要2个参数”
返回2
fi
parent=“${1}”
child=“${2}”
#交换到绝对路径
parent=“$(readlink-f“${parent}”)
child=“$(readlink-f“${child}”)
dir_child=“${child}”
#目录检查
如果[!-d“${parent}”];则
diru包含语法“parent dir${parent}不是目录或不存在”
返回2
elif[!-e“${child}]”;然后
diru语法“未找到文件${child}”
返回2
elif[!-d“${child}]”;然后
dir_child=`dirname“${child}”`
fi
#从$获取目录(pwd)
cd“${parent}”
父项_pwd=“$(pwd)”
cd“${curdir}”#以避免由于相对路径而导致的错误
cd“${dir_child}”
child_pwd=“$(pwd)”
#检查是否为父级
[“${child_pwd:0:${parent_pwd}}”=“${parent_pwd}”]&&result=0
#返回到当前目录
cd“${curdir}”
返回$result
}    
然后运行这些命令

. dircontains.sh

dircontains path/to/dir/parent any/file/to/test

# the result is in $? var 
# $1=0, <file> is in <dir_parent>
# $1=1, <file> is not in <dir_parent>
# $1=2, error
。dircontains.sh
dir包含路径/to/dir/parent any/file/to/test
#结果是美元?变量
#$1=0,在
#$1=1,不在
#$1=2,错误
Obs:
-仅在ubuntu 16.04/bash中测试

-在这种情况下,第二个参数可以是任何Linux文件,不使用外部命令:

#!/bin/bash

parent=$1
child=$2
[[ $child && $parent ]] || exit 2 # both arguments must be present
child_dir="${child%/*}"           # get the dirname of child
if [[ $child_dir = $parent && -d $child ]]; then
  echo YES
else
  echo NO
fi

也适用于子目录:

parent=$1
child=$2

if [[ ${child/$parent/} != $child ]] ; then
    echo "YES"
else
    echo "NO"
fi

您想查看
$parent
是否在某个级别是
$child
的父级?这是一个字符串前缀检查(假设您不担心符号链接、
。/
游戏等)。使用
查找-type d-name“$child”
。这不起作用的原因是,在第二个if语句中,您将整个子路径附加到父路径。这将导致一个不存在的目录,并且它将始终导致NO.@Kanny Bros,如果您只希望文件夹名为
$child
,而不是绝对路径,请使用
child=$(basename$2)