Czy komenda listy uniksowej „ls” może wyświetlać numeryczne uprawnienia chmod?

179

Czy podczas wyświetlania katalogu można wyświetlić numeryczne uprawnienia uniksowe, takie jak 644, zamiast symbolicznego wyjścia -rw-rw-r--

Dzięki.

Jon Winstanley
źródło

Odpowiedzi:

339

prawie może ..

 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
źródło
31
Aby utworzyć go jako alias (przykład poniżej: polecenie „cls”), użyj: 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
Skopiowałem i wkleiłem wiersz z niebezpieczeństwa89 i stwierdziłem, że dziwnie wyjście zaczynało się od% 0..o na linię, zamiast powiedzieć 755. Jeśli ktokolwiek inny zetknie się z tym, przyczyną wydaje się być ukryty znak między 0 a o. Po usunięciu polecenie jest ładnie skonfigurowane. Twoje zdrowie!
Donna,
Myślę, że jest problem z obliczeniami. Po chmod 777 dirtwoim poleceniu wypisuje uprawnienia jako767
Julian F. Weinert
Jak wspomniała Donna, między 0 a 0 jest zabawna postać (lub 2), a także dziwnie wygląda na to, że SO ją dodaje ...
nbsp
3
To nie rozpoznaje bitów t i s. Należy użyć polecenia „stat”, aby uzyskać informacje o uprawnieniach do plików. Obliczenie go ręcznie spowoduje błędy!
Evan Langlois,
148

Najbliższe, o czym mogę myśleć (upraszczając to dość prosto) stat, zakładając, że wiesz, których plików szukasz. Jeśli nie, *możesz znaleźć większość z nich:

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

Po wyjęciu z pudełka radzi sobie z klejem, suidem i towarzystwem:

$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo
JB.
źródło
20
Działa to świetnie pod Linuksem, znalazłem, że stat -f '%A %N' *robi to samo na komputerze Mac (FreeBSD)
reevesy
2
Myślę, że argumentem jest to, że statnie jest, lsdlatego nie jest to poprawna odpowiedź. Uważam jednak, że jest to poprawna odpowiedź w kontekście pożądanych wyników. Jeśli awkjest dozwolone w potoku, to findpowinno być dozwolone tam, gdzie statjest wywoływane -exec; wtedy możesz używać statbezpośrednio bez*
javafueled
2
Jest to o wiele lepiej krótsze i działa w 100% na dowolnym systemie
Kangarooo
Jeśli chcesz użyć statystyki, aby zobaczyć prawa rekurencyjnie, w bash użyj stat -c '%a %n' * **/*.
Denis Chevalier,
61

możesz po prostu użyć GNU find.

find . -printf "%m:%f\n"
ghostdog74
źródło
To polecenie naprawdę pamiętam. Pomocny i skuteczny.
Trent
5
Powinno to również mieć -maxdepth 1opcję, w przeciwnym razie przejdzie przez całe drzewo katalogów.
Ruslan
36

Możesz użyć następującego polecenia

stat -c "%a %n" *

Możesz także użyć dowolnego filenamelub directorynamezamiast, *aby uzyskać określony wynik.

Na komputerze Mac możesz użyć

stat -f '%A %N' *
Mohd Abdul Mujib
źródło
1
Nie działało dla mnie. stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
rschwieb
1
działa na Ubuntu 14.04 .. aby nigdy nie pamiętać o tym Dodałem alias w moim .bashrc: alias xxx = "stat -c '% a% n' *"
faeb187
1
Pomocny! Jak wykopałeś% A, który nawet nie pojawia się w statystykach na Macu?
igonejack
1
W rzeczywistości jest to polecenie FreeBSD, a Mac jest po prostu oparty na tym, że używa go jako górnego jądra.
Mohd Abdul Mujib
Jeśli używamy tylko informacji przedstawionych w man statsystemie macOS 10.14.4, polecenie powinno być stat -f "%Lp %N" *. %Lpwydaje się drukować to samo co %A.
Cesar Andreu,
17

@ MYYN

wow, niezły awk! Ale co z sidid, sgid i lepki kawałek?

Musisz rozszerzyć filtr za pomocą s i t, w przeciwnym razie nie będą się one liczyć i otrzymasz zły wynik. Aby obliczyć liczbę ósemkową dla tych specjalnych flag, procedura jest taka sama, ale indeks wynosi 4 7 i 10. Możliwe flagi dla plików z ustawionym ---s--s--tzestawem bitów są następujące:---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
}'  

Dla testu:

touch blah
chmod 7444 blah

spowoduje:

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

i

touch blah
chmod 7555 blah

da:

7555 -r-sr-sr-t 1 cheko cheko   0 2009-12-05 01:03 blah
użytkownik224243
źródło
3
+1 dzięki! 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;}'"
Skróciłem
+1 poszedł
Yordan Georgiev
5
Nie używaj lsmod jako aliasu ... to znane polecenie posix do wyświetlania modów jądra.
shadowbq
@JeroenWiertPluimers To daje mi błąd składniowy z awk
Evan Langlois
@EvanLanglois, więc zadaj nowe pytanie.
Jeroen Wiert Pluimers,
9

Służy do wyświetlania numerycznych wartości uprawnień (wartości ósemkowe) i nazwy pliku.

stat -c '%a %n' *

Służy do wyświetlania numerycznych wartości uprawnień uniksowych (wartości ósemkowe) oraz sgid i lepki folder folderu, nazwę użytkownika właściciela, nazwę grupy, całkowity rozmiar w bajtach i nazwę pliku.

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

wprowadź opis zdjęcia tutaj

Dodaj, %yjeśli potrzebujesz czasu ostatniej modyfikacji w formacie czytelnym dla człowieka. Aby uzyskać więcej opcji, zobacz stat .

Lepsza wersja przy użyciu aliasu

Korzystanie z aliasu jest bardziej wydajnym sposobem na osiągnięcie tego, czego potrzebujesz, i obejmuje również kolor. Poniżej przedstawiono wyniki uporządkowane najpierw według katalogów grup, wyświetlane w kolorze, rozmiary wydruków w formacie czytelnym dla człowieka (np. 1K 234M 2G), edytuj ~/.bashrci dodaj alias do swojego konta lub globalnie, edytując/etc/profile.d/custom.sh

Wpisanie clswyświetla wyniki nowego polecenia 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 ​​jest najbardziej wydajnym rozwiązaniem

Drzewo folderów

Podczas edytowania pliku bashrc lub custom.sh dołącz następujący alias, aby wyświetlić graficzną reprezentację, w której wpisanie lstreewyświetli bieżącą strukturę drzewa folderów

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

Wyświetli się:

   |-scripts
   |--mod_cache_disk
   |--mod_cache_d
   |---logs
   |-run_win
   |-scripts.tar.gz
Erick Gonzalez
źródło
4

Nie używasz ls do uzyskania informacji o uprawnieniach do pliku. Używasz polecenia stat. Otrzymasz pożądane wartości liczbowe. „Sposób uniksowy” mówi, że powinieneś wymyślić swój własny skrypt, używając ls (lub „echo *”) i stat oraz cokolwiek innego, co chcesz podać w żądanym formacie.

Evan Langlois
źródło
1

Opierając się na wybranej odpowiedzi i sugestii użycia aliasu , przekonwertowałem ją na funkcję, aby możliwe było przekazanie katalogu do listy.

# 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
źródło