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

179

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

Merci.

Jon Winstanley
la source

Réponses:

339

ça peut presque ...

 ls -l | 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}'
Miku
la source
31
Pour le créer comme alias (exemple ci-dessous: commande 'cls'), utilisez: alias cls="ls -l | 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}'"
danger89
6
J'ai copié et collé la ligne de danger89 et j'ai trouvé que la sortie commençait étrangement par% 0..o par ligne, au lieu de dire 755. Si quelqu'un d'autre rencontre cela, la cause semble être un caractère caché entre le 0 et le o. Une fois supprimée, la commande est bien configurée. À votre santé!
Donna
Je pense qu'il y a un problème de calcul. Après que chmod 777 dirvotre commande imprime les autorisations comme767
Julian F. Weinert
Comme Donna le mentionne, il y a un personnage drôle (ou 2) entre le 0 et le o, aussi, bizarrement, on dirait que SO l'ajoute ...
nbsp
3
Cela ne reconnaît pas les bits t et s. Vous devez utiliser la commande 'stat' pour obtenir les informations d'autorisation de fichier. Le calculer à la main entraînera des erreurs!
Evan Langlois
148

Le plus proche statauquel je puisse penser (en restant assez simple) est , en supposant que vous sachiez quels fichiers vous recherchez. Si vous ne le faites pas, vous *pouvez trouver la plupart d'entre eux:

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

Il gère les collants, les suides et les entreprises hors de la boîte:

$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo
JB.
la source
20
Cela fonctionne très bien sous Linux, j'ai trouvé stat -f '%A %N' *qu'il
faisait
2
Je suppose que l'argument est que ce statn'est pas, lsdonc ce n'est pas la bonne réponse. Cependant, je pense que c'est la bonne réponse dans le contexte du résultat souhaité. Si awkest autorisé dans un tuyau, alors finddevrait être autorisé là où statest appelé -exec; alors vous pouvez utiliser statdirectement sans*
javafueled
2
C'est beaucoup mieux plus court et fonctionne à 100% sur n'importe quel système
Kangarooo
Si vous souhaitez utiliser stat pour voir les droits de manière récursive, sous bash, utilisez stat -c '%a %n' * **/*.
Denis Chevalier
61

vous pouvez simplement utiliser GNU find.

find . -printf "%m:%f\n"
ghostdog74
la source
C'est une commande dont je me souviens vraiment. Utile et efficace.
Trent
5
Cela devrait également avoir une -maxdepth 1option, sinon il parcourt toute l'arborescence des répertoires.
Ruslan
36

Vous pouvez utiliser la commande suivante

stat -c "%a %n" *

Vous pouvez également utiliser tout filenameou au directorynamelieu d' *obtenir un résultat spécifique.

Sur Mac, vous pouvez utiliser

stat -f '%A %N' *
Mohd Abdul Mujib
la source
1
Cela n'a pas fonctionné pour moi. stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
rschwieb
1
fonctionne sur ubuntu 14.04 .. pour ne jamais avoir à m'en souvenir, j'ai ajouté un alias dans mon .bashrc: alias xxx = "stat -c '% a% n' *"
faeb187
1
Utile! Comment déterrez-vous le% A qui n'apparaît même pas dans Man of Stat sur Mac?
igonejack
1
C'est en fait une commande FreeBSD, et Mac se trouve juste à être construit sur cela en l'utilisant comme noyau supérieur.
Mohd Abdul Mujib
Si nous n'utilisons que les informations présentées dans man statmacOS 10.14.4, la commande devrait être stat -f "%Lp %N" *. %Lpsemble imprimer la même chose que %A.
Cesar Andreu
17

@Le MYYN

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

Vous devez étendre votre filtre avec s et t, sinon ils ne compteront pas et vous obtenez un mauvais résultat. Pour calculer le nombre octal pour 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 un bit d'exécution sont ---s--s--tamd pour les fichiers sans bit d'exécution 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 le 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
user224243
la source
3
+1 Merci! Je l'ai raccourci en un alias sur 1 ligne:alias "lsmod=ls -al|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;}'"
Jeroen Wiert Pluimers
+1 a poussé l'idée plus loin de restaurer les autorisations des fichiers de travail: ysgitdiary.blogspot.fi/2013/04
Yordan Georgiev
5
N'utilisez pas lsmod comme alias ... c'est une commande posix connue pour lister les mods du noyau.
shadowbq
@JeroenWiertPluimers Cela me donne une erreur de syntaxe de awk
Evan Langlois
@EvanLanglois alors posez une nouvelle question.
Jeroen Wiert Pluimers
9

Utilisez cette option pour afficher les valeurs numériques d'autorisation Unix (valeurs octales) et le nom de fichier.

stat -c '%a %n' *

Utilisez ceci pour afficher les valeurs numériques d'autorisation Unix (valeurs octales) et le sgid et le sticky bit 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' *

entrez la description de l'image ici

Ajouter %y si vous avez besoin de l'heure de la dernière modification dans un 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 d'accomplir ce dont vous avez besoin et inclut également la couleur. Les éléments suivants affichent d'abord vos résultats organisés par répertoires de groupe, affichent en couleur, tailles d'impression au format lisible par l'homme (par exemple, 1K 234M 2G)~/.bashrc et ajoutez un alias pour votre compte ou globalement en éditant/etc/profile.d/custom.sh

La saisie clsaffiche 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 ​​est la solution la plus efficace

Arborescence des dossiers

Pendant que vous modifiez votre bashrc ou custom.sh, incluez l'alias suivant pour voir une représentation graphique où la saisie lstreeaffichera l'arborescence de vos dossiers actuelle

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
Erick Gonzalez
la source
4

Vous n'utilisez pas ls pour obtenir les informations d'autorisation d'un fichier. Vous utilisez la commande stat. Il vous donnera les valeurs numériques souhaitées. La "manière Unix" dit que vous devez inventer votre propre script en utilisant ls (ou 'echo *') et stat et tout ce que vous voulez pour donner les informations dans le format que vous désirez.

Evan Langlois
la source
1

En me basant sur la réponse choisie et la suggestion d'utiliser un alias , je l'ai converti en fonction afin que le passage d'un répertoire à la liste soit possible.

# 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}"
}
Curtis Blackwell
la source