web-dev-qa-db-fra.com

La commande de liste Unix 'ls' peut-elle générer des autorisations chmod numériques?

Est-il possible, lors de la création d'un répertoire, d'afficher les autorisations Unix numériques telles que 644 plutôt que la sortie symbolique -rw-rw-r--

Merci.

167
Jon Winstanley

Utilisez-le pour afficher les valeurs octales (autorisations numériques de chmod) et le nom du fichier:

stat -c '%a %n' *

 enter image description here

Pour plus d'options, voir stat .

Pour un moyen plus efficace de faire cela en utilisant un alias, voir mon commentaire ci-dessous.

301
miku

Le plus proche que je puisse penser (en le gardant assez simple) est stat, en supposant que vous sachiez quels fichiers vous recherchez. Si vous ne le faites pas, * peut en trouver la plupart:

/usr/bin$ stat -c '%a %n' *
755 [
755 a2p
755 a2ps
755 aclocal
...

Il gère collant, suid et compagnie hors de la boîte:

$ stat -c '%a %n' /tmp /usr/bin/Sudo
1777 /tmp
4755 /usr/bin/Sudo
138
JB.

vous pouvez simplement utiliser GNU find.

find . -printf "%m:%f\n"
55
ghostdog74

Vous pouvez utiliser la commande suivante

stat -c "%a %n" *

Vous pouvez également utiliser les variables filename ou directoryname au lieu de * pour obtenir un résultat spécifique.

Sur Mac, vous pouvez utiliser 

stat -f '%A %N' *
28
Mohd Abdul Mujib

@Le MYYN

wow, Nice awk! Mais qu'en est-il suid, sgid et collant? 

Vous devez étendre votre filtre avec s et t, sinon ils ne compteront pas et vous obtiendrez un résultat erroné. Pour calculer le nombre octal de ces drapeaux spéciaux, la procédure est la même mais l'index est à 4 7 et 10. Les drapeaux possibles pour les fichiers avec le bit d'exécution défini sont ---s--s--t AMD pour les fichiers sans le bit d'exécution défini sont ---S--S--T

ls -l | awk '{
    k = 0
    s = 0
    for( i = 0; i <= 8; i++ )
    {
        k += ( ( substr( $1, i+2, 1 ) ~ /[rwxst]/ ) * 2 ^( 8 - i ) )
    }
    j = 4 
    for( i = 4; i <= 10; i += 3 )
    {
        s += ( ( substr( $1, i, 1 ) ~ /[stST]/ ) * j )
        j/=2
    }
    if ( k )
    {
        printf( "%0o%0o ", s, k )
    }
    print
}'  

Pour test:

touch blah
chmod 7444 blah

aura pour résultat:

7444 -r-Sr-Sr-T 1 cheko cheko   0 2009-12-05 01:03 blah

et

touch blah
chmod 7555 blah

va donner:

7555 -r-sr-sr-t 1 cheko cheko   0 2009-12-05 01:03 blah
14
user224243

Vous n'utilisez pas ls pour obtenir les informations de permission d'un fichier. Vous utilisez la commande stat. Cela vous donnera les valeurs numériques que vous voulez. "Unix Way" dit que vous devez inventer votre propre script en utilisant ls (ou "echo *") et stat, ainsi que tout ce que vous voulez, pour donner les informations dans le format souhaité.

4
Evan Langlois

non, il ne peut imprimer que des uids/guids numériques.

2
dusoft

Utilisez-le pour afficher les valeurs des autorisations numériques Unix (valeurs octales) et le nom du fichier.

stat -c '%a %n' *

Utilisez-le pour afficher les valeurs des autorisations numériques Unix (valeurs octales) et les bits sgid et sticky du dossier, le nom d'utilisateur du propriétaire, le nom du groupe, la taille totale en octets et le nom du fichier.

stat -c '%a %A %U %G %s %n' *

 enter image description here

Ajoutez %y si vous avez besoin de l'heure de la dernière modification en format lisible par l'homme. Pour plus d'options, voir stat .

Meilleure version utilisant un alias

L'utilisation d'un alias est un moyen plus efficace de répondre à vos besoins. Elle inclut également la couleur. Les éléments suivants affichent d’abord vos résultats classés par groupes de répertoires, couleurs, tailles d’impression au format lisible par l’homme (par exemple, 1K 234M 2G), éditez votre ~/.bashrc et ajoutez un alias pour votre compte ou globalement en modifiant /etc/profile.d/custom.sh 

Taper cls affiche les résultats de votre nouvelle commande LS.

alias cls="ls -lha --color=always -F --group-directories-first |awk '{k=0;s=0;for(i=0;i<=8;i++){;k+=((substr(\$1,i+2,1)~/[rwxst]/)*2^(8-i));};j=4;for(i=4;i<=10;i+=3){;s+=((substr(\$1,i,1)~/[stST]/)*j);j/=2;};if(k){;printf(\"%0o%0o \",s,k);};print;}'"

 Alias is the most efficient solution

Arborescence de dossiers

Pendant que vous modifiez votre bashrc ou custom.sh, incluez l'alias suivant pour afficher une représentation graphique dans laquelle taper lstree affichera la structure actuelle de votre arborescence de dossiers.

alias lstree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'"

Il afficherait: 

   |-scripts
   |--mod_cache_disk
   |--mod_cache_d
   |---logs
   |-run_win
   |-scripts.tar.gz
1
Erick Gonzalez

tl; dr: La réponse rapide à la question est, no ls ne peut pas imprimer les permissions numériques, utilisez stat .

Les autorisations étendues seront perdues lors de la traduction lors de la manipulation de awk.

par exemple:

$ ls -la /usr/local/src/
total 8
drwxrwsr-x  2 root staff 4096 Oct 23 11:18 .
drwxrwsr-x 10 root staff 4096 Oct 23 11:18 ..

La solution proposée afficherait ceci:

$ ls -la /usr/local/src | awk '{>
total 8
765 drwxrwsr-x  2 root staff 4096 Oct 23 11:18 .
765 drwxrwsr-x 10 root staff 4096 Oct 23 11:18 ..

Ce qui est totalement faux.

stat, d'autre part, réussit:

$ stat /usr/local/src Fichier: /usr/local/src Taille: 4096 Blocs: 8 IO Bloc: Répertoire 4096 Appareil: 801h/2049d Inode: 917803 Liens: 2 Accès: (2775/drwxrwsr-x) UID: (0 ​​/ racine) Gid: (50/personnel) Accès: 2018-10-24 12: 30: 58.197907324 +0900 Modifier: 2018-10-23 11: 18: 59.810677000 +0900 Changement: 2018-10-23 11: 18: 59.810677000 +0900 Naissance: -

Bonus de man stat:

$ stat -c %a /usr/local/src
2775

Cela a été testé sur Debian stable.

0
Steve Clement

En me basant sur réponse choisie et sur la suggestion d'utiliser un alias , je l'ai convertie en une fonction afin de pouvoir passer un répertoire à list.

# ls, with chmod-like permissions and more.
# @param $1 The directory to ls
function lls {
  LLS_PATH=$1

  ls -AHl $LLS_PATH | awk "{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/) \
                            *2^(8-i));if(k)printf(\"%0o \",k);print}"
}
0
Curtis Blackwell