在给定的 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
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