Dapatkah daftar Unix memerintahkan 'ls' mengeluarkan izin chmod numerik?

179

Apakah mungkin ketika mendaftar direktori untuk melihat izin unix numerik seperti 644 daripada output simbolik -rw-rw-r--

Terima kasih.

Jon Winstanley
sumber

Jawaban:

339

hampir bisa ..

 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
sumber
31
Untuk membuatnya sebagai alias (contoh di bawah ini: perintah 'cls'), gunakan: 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}'"
hazard89
6
Saya menyalin dan menempelkan garis dari bahaya89 dan menemukan bahwa anehnya output dimulai dengan% 0..o per baris, alih-alih mengatakan 755. Jika ada orang lain yang menemukan ini, penyebabnya tampaknya merupakan karakter tersembunyi antara 0 dan o. Setelah dihapus, perintah sudah diatur dengan baik. Bersulang!
Donna
Saya pikir ada masalah perhitungan. Setelah chmod 777 dirperintah Anda mencetak izin sebagai767
Julian F. Weinert
Seperti yang Donna sebutkan, ada karakter lucu (atau 2) antara 0 dan o, juga, anehnya sepertinya SO menambahkannya ...
nbsp
3
Ini gagal mengenali bit t dan s. Anda harus menggunakan perintah 'stat' untuk mendapatkan informasi izin file. Menghitungnya dengan tangan akan menyebabkan kesalahan!
Evan Langlois
148

Paling dekat yang bisa saya pikirkan (menjaganya agar tetap sederhana) adalah stat, dengan asumsi Anda tahu file mana yang Anda cari. Jika tidak, *dapat menemukan sebagian besar dari mereka:

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

Ini menangani lengket, suid dan perusahaan di luar kotak:

$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo
JB.
sumber
20
Ini berfungsi dengan baik di Linux, saya menemukan stat -f '%A %N' *melakukan hal yang sama pada mac (FreeBSD)
reevesy
2
Saya kira argumen adalah bahwa stattidak lskarena ini bukan jawaban yang benar. Namun, saya percaya ini adalah jawaban yang benar dalam konteks hasil yang diinginkan. Jika awkdiizinkan dalam pipa, maka findharus diizinkan di mana statdipanggil -exec; maka Anda dapat menggunakan statlangsung tanpa*
javafueled
2
Ini jauh lebih baik lebih pendek dan 100% bekerja pada sistem apa pun
Kangarooo
Jika Anda ingin menggunakan stat untuk melihat hak secara rekursif, di bawah bash, gunakan stat -c '%a %n' * **/*.
Denis Chevalier
61

Anda bisa menggunakan GNU find.

find . -printf "%m:%f\n"
ghostdog74
sumber
Ini adalah perintah yang bisa saya ingat. Bermanfaat dan efektif.
Trent
5
Ini juga harus memiliki -maxdepth 1opsi, jika tidak melintasi seluruh pohon direktori.
Ruslan
36

Anda dapat menggunakan perintah berikut

stat -c "%a %n" *

Anda juga dapat menggunakan filenameatau directorynamebukannya *untuk mendapatkan hasil tertentu.

Di Mac, Anda bisa menggunakan

stat -f '%A %N' *
Mohd Abdul Mujib
sumber
1
Tidak bekerja untuk saya. stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
rschwieb
1
berfungsi di ubuntu 14.04 .. untuk tidak harus mengingat ini, saya telah menambahkan alias di .bashrc: alias xxx = "stat -c '% a% n' *"
faeb187
1
Bermanfaat! Bagaimana Anda menggali% A yang bahkan tidak muncul di man of stat di Mac?
igonejack
1
Sebenarnya itu adalah perintah FreeBSD, dan Mac kebetulan dibangun berdasarkan itu menggunakannya sebagai kernel atas.
Mohd Abdul Mujib
Jika kita hanya menggunakan informasi yang disajikan man statpada macOS 10.14.4, maka perintahnya seharusnya stat -f "%Lp %N" *. %Lpmuncul untuk mencetak hal yang sama dengan %A.
Cesar Andreu
17

@The MYYN

wow, awk bagus! Tapi bagaimana dengan suid, sgid dan sticky bit?

Anda harus memperluas filter Anda dengan s dan t, jika tidak mereka tidak akan menghitung dan Anda mendapatkan hasil yang salah. Untuk menghitung angka oktal untuk flag-flag khusus ini, prosedurnya sama tetapi indeksnya di 4 7 dan 10. flag-flag yang mungkin untuk file-file dengan bit set eksekusi adalah ---s--s--tamd untuk file-file tanpa bit eksekusi---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
}'  

Untuk tes:

touch blah
chmod 7444 blah

akan menghasilkan:

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

dan

touch blah
chmod 7555 blah

akan memberi:

7555 -r-sr-sr-t 1 cheko cheko   0 2009-12-05 01:03 blah
pengguna224243
sumber
3
+1 Terima kasih! Saya menyingkatnya menjadi alias 1-baris: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 mengambil gagasan lebih lanjut untuk memulihkan izin file yang berfungsi: ysgitdiary.blogspot.fi/2013/04/…
Yordan Georgiev
5
Jangan gunakan lsmod sebagai alias .. itu perintah posix yang dikenal untuk mendaftarkan mod kernel.
shadowbq
@JeroenWiertPluimers Itu memberi saya kesalahan sintaks dari awk
Evan Langlois
@ EvanLanglois, jadi ajukan pertanyaan baru.
Jeroen Wiert Pluimers
9

Gunakan ini untuk menampilkan nilai izin numerik Unix (nilai oktal) dan nama file.

stat -c '%a %n' *

Gunakan ini untuk menampilkan nilai izin numerik Unix (nilai oktal) dan bit sgid dan sticky folder, nama pengguna pemilik, nama grup, ukuran total dalam byte dan nama file.

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

masukkan deskripsi gambar di sini

Tambahkan %yjika Anda memerlukan waktu modifikasi terakhir dalam format yang dapat dibaca manusia. Untuk opsi lebih lanjut lihat stat .

Versi yang lebih baik menggunakan Alias

Menggunakan alias adalah cara yang lebih efisien untuk mencapai apa yang Anda butuhkan dan itu juga termasuk warna. Berikut ini menampilkan hasil Anda yang diatur oleh direktori grup terlebih dahulu, ditampilkan dalam warna, ukuran cetak dalam format yang dapat dibaca manusia (misalnya, 1K 234M 2G) edit ~/.bashrcdan tambahkan alias untuk akun Anda atau secara global dengan mengedit/etc/profile.d/custom.sh

Mengetik clsmenampilkan hasil perintah LS Anda yang baru.

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 ​​adalah solusi paling efisien

Pohon Folder

Saat Anda mengedit bashrc atau custom.sh, sertakan alias berikut untuk melihat representasi grafis tempat pengetikan lstreeakan menampilkan struktur hierarki folder Anda saat ini

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

Ini akan menampilkan:

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

Anda tidak menggunakan ls untuk mendapatkan informasi izin file. Anda menggunakan perintah stat. Ini akan memberi Anda nilai numerik yang Anda inginkan. "Unix Way" mengatakan bahwa Anda harus menciptakan skrip Anda sendiri menggunakan ls (atau 'echo *') dan stat dan apa pun yang Anda suka untuk memberikan informasi dalam format yang Anda inginkan.

Evan Langlois
sumber
1

Membangun dari jawaban yang dipilih dan saran untuk menggunakan alias , saya mengonversinya menjadi fungsi sehingga melewati direktori ke daftar dimungkinkan.

# 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
sumber