Percorra o caminho e marque / defina permissões no shell script - como?

1

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")?

    
por k-fish 03.11.2009 / 15:43

5 respostas

0

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
    
por 03.11.2009 / 16:51
1

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.

    
por 19.04.2011 / 21:54
1

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[@]}
}
    
por 11.11.2014 / 21:23
1

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
    
por 11.11.2014 / 21:52
0

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
    
por 09.12.2013 / 13:58