遍历路径并在 shell 脚本中检查/设置权限 - 如何操作?

遍历路径并在 shell 脚本中检查/设置权限 - 如何操作?

在给定的 shell 脚本中,我需要获取已知路径并向上检查(到文件系统根目录)以获得正确的权限。如何在 shell 脚本中拆分路径并向上移动(可以是 bash 或“最低公分母”)?

答案1

这应该有效:

unset path
parts=$(pwd | awk 'BEGIN{FS="/"}{for (i=1; i < NF; i++) print $i}')

for part in $parts
do
path="$path/$part"
ls -ld $path   # do whatever checking you need here
done

答案2

当我尝试 ennuikiller 的 awk 解决方案时,它没有找到当前目录。

因此,虽然有点晚了,但这是一个仅适用于 bash 的解决方案:

foo=`pwd`
while [ "$foo" != "" ]; do
    echo $foo # work with directory here
    foo=${foo%/*}
done

不知道这是否是最优雅的解决方案,但它确实有效。我在特发性肺结核并将其绕成一个圈。

答案3

扩展ennuikiller 的解决方案

realpath () {
    # realpath()        -- print absolute path (os.path.realpath) to $1
    #                      note: OSX does not have readlink -f
    python -c "import os,sys; print(os.path.realpath(os.path.expanduser(sys.argv[1])))" "${1}"
    return
}

walkpath () {
    # walkpath()        -- walk down path $1 and $cmd each component
    #   $1 : path (optional; default: pwd)
    #   $2 : cmd  (optional; default: ls -ald --color=auto)
    #https://superuser.com/a/65076 
    dir=${1:-$(pwd)}
    if [ $(uname) == "Darwin" ]; then
        cmd=${2:-"ls -ldaG"}
    else
        cmd=${2:-"ls -lda --color=auto"}
    fi
    dir=$(realpath ${dir})
    parts=$(echo ${dir} \
        | awk 'BEGIN{FS="/"}{for (i=1; i < NF+2; i++) print $i}')
    paths=('/')
    unset path
    for part in $parts; do
        path="$path/$part"
        paths=("${paths[@]}" $path)
    done
    ${cmd} ${paths[@]}
}

答案4

在 Linux 上,您可以使用 util-linux 中包含的实用程序namei列出标准 Unix 权限:

namei -v path

下面是另一个不包含 bashism 的脚本,应该可以在任何现代的 Bourne 类 shell 中运行。为了分解路径,它使用标准命令dirname逐渐剥离最后一个组件,直到/.停止(并且路径不再改变)。只需将任何代码替换为ls -ld对路径的所有组件执行(例如getfacl)。

#!/bin/sh

f="$1"
p=
while test "$f" != "$p" ; do
    ls -ld "$f"
    p="$f"
    f="$(dirname "$f")"
done

相关内容