1 votes

Traverser le chemin vers le haut et vérifier/définir les permissions dans Shell Shell - comment ?

Dans un Shell Shell donné, je dois prendre un chemin connu et le vérifier vers le haut (jusqu'à la racine du système de fichiers) pour des permissions correctes. Comment pourrais-je diviser le chemin et remonter dans un Shell Shell (peut être bash ou un "plus petit dénominateur commun") ?

1voto

torpesco Points 11

Lorsque j'ai essayé la solution awk d'ennuikiller, le répertoire courant n'a pas été pris en compte.

Donc, bien qu'il soit un peu tard, voici une solution uniquement bash :

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

Je ne sais pas si c'est la solution la plus élégante, mais elle fonctionne. J'ai trouvé une explication simple de la manipulation des chaînes de caractères sur tldp et a enroulé une boucle autour d'elle.

1voto

Wes Turner Points 204

Pour développer La solution d'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[@]}
}

1voto

Hubro Points 13319

Dans Bash, avec le chemin donné dans une variable Shell (par exemple $DIR), vous pouvez toujours obtenir le dernier composant du chemin (le plus bas) en utilisant la commande basename et le chemin restant avec la commande dirname commandement :

DIR="/home/user/mail/work/spam"
LAST="$( basename "$DIR" )"
DIR=""$( dirname "$DIR" )"

résulte en $DIR=/home/user/mail/work y $LAST=spam

Mais pourquoi utiliser des variables quand on peut simplement emprunter le chemin lui-même :

while [ "/" \!= $(pwd) ] ; do
    (chmod|setfacl|do_anything) .
    cd .. ;
done

0voto

Mark T Points 1276

Cela devrait fonctionner :

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

0 votes

Merci, ça marche. Existe-t-il une solution uniquement pour les (ba)sh ?

0voto

Sous Linux, vous pouvez utiliser l'utilitaire namei qui est inclus dans util-linux pour lister les permissions standard d'Unix :

namei -v path

Voici un autre script qui ne contient pas de bashismes et devrait s'exécuter dans n'importe quel script moderne de type Bourne. Pour la décomposition du chemin il utilise la commande standard dirname pour enlever progressivement le dernier composant jusqu'à ce que / o . se repose (et le chemin ne change plus). Il suffit de mettre n'importe quel code à la place de ls -ld à effectuer sur tous les composants de la voie (par ex. getfacl ).

#!/bin/sh

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X