Isso deve funcionar:
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
Em um determinado script de shell, preciso usar um caminho conhecido e verificá-lo para cima (para a raiz do sistema de arquivos) para obter as permissões corretas. Como eu dividiria o caminho e subiria em um shell script (pode ser bash ou um "denominador comum inferior")?
Quando eu tentei a solução awk do ennuikiller, ela perdeu o diretório atual para mim.
Então, embora um pouco atrasado, aqui está uma solução apenas para o bash:
foo='pwd'
while [ "$foo" != "" ]; do
echo $foo # work with directory here
foo=${foo%/*}
done
Não sei se é a solução mais elegante, mas funciona. Eu encontrei uma explicação simples sobre a manipulação de string em tldp e envolvi um loop em torno dele.
Para expandir a solução da 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[@]}
}
No Bash com o caminho dado em uma variável de shell (por exemplo, $ DIR) você sempre pode obter o último (mais baixo) caminho usando o comando basename
e o caminho restante com o comando dirname
:
DIR="/home/user/mail/work/spam"
LAST="$( basename "$DIR" )"
DIR=""$( dirname "$DIR" )"
resulta em $DIR=/home/user/mail/work
e $LAST=spam
Mas por que usar variáveis quando você pode simplesmente percorrer o caminho:
while [ "/" \!= $(pwd) ] ; do
(chmod|setfacl|do_anything) .
cd .. ;
done
No Linux você pode usar o utilitário namei
que está incluso no util-linux para listar as permissões padrão do Unix:
namei -v path
Abaixo está outro script que não contém bashisms e deve ser executado em qualquer shell moderno semelhante ao Bourne. Para decompor o caminho, ele usa o comando padrão dirname
para remover gradualmente o último componente até que /
ou .
fique (e o caminho não mude mais). Basta colocar qualquer código em vez de ls -ld
para executar todos os componentes do caminho (por exemplo, getfacl
).
#!/bin/sh
f="$1"
p=
while test "$f" != "$p" ; do
ls -ld "$f"
p="$f"
f="$(dirname "$f")"
done
Tags permissions shell path script