Bagaimana saya bisa mendapatkan izin file oktal dari baris perintah?

373

Ada perintah chmod untuk mengatur izin file, tetapi bisakah saya mendapatkan izin file dalam mode oktal (seperti 755) dari baris perintah?

Anwar
sumber
2
Untuk orang-orang seperti saya yang secara tidak sengaja mendarat di halaman ini tetapi sebenarnya sedang mencari cara melakukan ini di Mac: stackoverflow.com/a/14855227/470749
Ryan
2
stat --format "%A" $FILEmemberi Anda drwxr-x---format yang dapat dibaca manusia . yang mungkin bermanfaat atau tidak.
Trevor Boyd Smith

Jawaban:

535

Anda dapat mencoba

stat -c "%a %n" *

Ganti *dengan direktori yang relevan atau nama file yang tepat yang ingin Anda periksa.

Dari halaman manual stat ,

-c  --format=FORMAT
          use  the  specified  FORMAT instead of the default; output a newline after
          each use of FORMAT
%a     Access rights in octal
%n     File name

Pemakaian:

  • Dengan file:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • Dengan folder:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(Referensi)

jokerdino
sumber
57
di mac os, gunakan stat -f '%A %a %N' *(kredit: geeklog.adamwilson.info/article/58/… )
s2t2
1
Jika Anda lebih nyaman dengan ls:for f in $(ls -a); do stat -c "%a %n" $f; done;
usandfriends
2
@ usandfriends looping pada output lsadalah ide yang buruk. Jika Anda benar-benar ingin menggunakan loop yang dapat Anda lakukanfor f in *; do stat "%a %n" "$f"; done
Tom Fenech
1
Kenapa di mac os semuanya sedikit berubah (bahkan di unix iso utils)? Apakah ada alasan sebenarnya ini?
Vassilis
2
Tolong @ Hackel, beri tahu kami bagaimana perasaan Anda sebenarnya. lol!
MikeSchinkel
44

Izin file di Linux dapat ditampilkan dalam format oktal menggunakan perintah stat Linux.

Cukup tekan Ctrl+ Alt+ Tdi keyboard Anda untuk membuka Terminal. Saat terbuka, Arahkan ke direktori tempat Anda ingin menemukan izin file dalam mode oktal.

stat -c '%A %a %n' *

% A Hak akses dalam bentuk yang dapat dibaca manusia

% a Hak akses di oktal

% n Nama file

Angka dan izin oktal

Anda dapat menggunakan angka oktal untuk mewakili mode / izin:

r: 4
w: 2
x: 1

Misalnya, untuk pemilik file, Anda dapat menggunakan mode oktal sebagai berikut. Membaca, menulis, dan mengeksekusi (penuh) izin pada file dalam oktal adalah 0 + r + w + x = 0 + 4 + 2 + 1 = 7

Hanya Baca dan tulis izin pada file dalam oktal adalah 0 + r + w + x = 0 + 4 + 2 + 0 = 6

Hanya membaca dan menjalankan izin pada file dalam oktal adalah 0 + r + w + x = 0 + 4 + 0 + 1 = 5

Gunakan metode di atas untuk menghitung izin untuk grup dan lainnya. Katakanlah Anda ingin memberikan izin penuh kepada pemilik, membaca & mengeksekusi izin ke grup, dan hanya membaca izin kepada orang lain, maka Anda perlu menghitung izin sebagai berikut: Pengguna = r + w + x = 0 + 4 + 2 + 1 = 7 Grup = r + w + x = 0 + 4 + 2 + 0 = 6 Lainnya = r + w + x = 0 + 0 + 0 + 1 = 1

Izin efektif adalah 761.

Sumber: http://kmaiti.blogspot.com/2011/09/umask-concept.html

Mitch
sumber
2
0 awal juga mewakili bit khusus: pastebin.com/6ymkFt71
Braiam
36

Sebagaimana dirinci dalam izin gaya "755" dengan 'ls' oleh Adam Courtemanche di AgileAdam.com , Anda dapat membuat alias lso yang bertindak seperti ls -ltetapi sedikit memproses output 1 untuk menampilkan izin juga di oktal. Ini menambahkan kolom terkemuka yang menunjukkan izin oktal tiga digit dua digit . Seperti yang ditulis, ini berfungsi untuk sebagian besar file dan direktori, tetapi tidak berfungsi dengan baik jika bit sticky atau setuid / setgid diatur. 3

alias lso="ls -alG | 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}'"

Namun, ini memiliki kelemahan serius, seperti yang ditunjukkan oleh techtonik . Anda tidak dapat meneruskan argumen ke alias ini seperti yang Anda lakukan pada perintah , karena argumen tersebut diambil sebagai argumen tambahan . Dengan demikian Anda tidak dapat berjalan pada file atau direktori tertentu, Anda juga tidak bisa meneruskan opsi apa pun (seperti , atau ) ke .lsolsawklso-F--colorlso


Cara mengatasinya adalah untuk mendefinisikan lso sebagai fungsi daripada alias.

lso() { ls -alG "$@" | 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}'; }

Jika Anda mencoba ini secara interaktif di shell Anda, jalankan unalias lsountuk menghapus alias - Anda dapat melakukannya sebelum atau setelah Anda mendefinisikan fungsi. Jika Anda memasukkannya ke file yang bersumber, seperti ~/.bashrc, ambil saja aliasbaris dan tambahkan definisi fungsi.

Mengapa ini bekerja? Tidak seperti alias, fungsi bash shell dapat mengambil parameter posisi , yaitu argumen baris perintah . "$@"meluas ke daftar argumen lengkap , menyebabkan argumen untuk lsofungsi diteruskan ls. (Tidak seperti definisi alias, badan fungsi tidak dikutip; karena itu perlu untuk menghapus \karakter sebelum $dan ".)

Karena Anda dapat meneruskan opsi lsoketika didefinisikan sebagai fungsi, Anda mungkin ingin menghapus -adan -Gopsi dari definisi - Anda dapat meneruskannya secara manual jika Anda menginginkannya. ( The -lopsi diperlukan untuk rincian seperti hak akses file yang akan ditampilkan sama sekali , sehingga tidak ada manfaat untuk menghapus itu.)

lso() { 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}'; }

Terima kasih kepada techtonik untuk menunjukkan batasan dalam mendefinisikan lsosebagai alias, sehingga memotivasi saya untuk memperluas posting ini dengan materi tentang menjadikannya fungsi.


1 Orang mungkin memperhatikan bahwa ini tampaknya melanggar aturan umum tentang tidak mem-parsing output darils . lsmenghasilkan keluaran yang sangat bisa dibaca manusia; ini memperkenalkan kekhasan dan keterbatasan sehingga secara umum tidak cocok sebagai input untuk perintah lain. Dalam hal ini kami menguraikan lskarena kami ingin mempertahankan perilaku yang tepatls kecuali satu perubahan kami yang ditambahkan.

2 Satu batasan alias ini, yang juga berlaku untuk versi fungsi yang ditunjukkan di bawahnya, dan yang dapat dianggap bug, adalah bahwa ia hanya menampilkan tiga digit oktal bahkan ketika digit oktal keempat adalah nol. Sebagai jfmercer telah benar menunjukkan , angka oktal yang ditampilkan di sini tidak mencerminkan sedikit lengket jika sekarang, maupun setuid atau setgid bit.

3 Lebih serius dari sekedar tidak menunjukkan digit oktal keempat adalah bahwa metode ini mengasumsikan mereka tidak diatur, dan jika mereka - jika Anda melihat t, satau Sdalam izin string yang - maka Anda harus mengabaikan digit oktal . Ini karena bit disimpulkan dari string izin dengan cara yang tidak memperhitungkan bit setuid / setgid yang lengket.

Eliah Kagan
sumber
tidak bekerja dengan direktori -awk: read error (Is a directory)
anatoly techtonik
@ techtonik Terima kasih telah menunjukkan ini! Saya (akhirnya) telah memperbarui jawaban ini untuk menyertakan perbaikan untuk itu.
Eliah Kagan
1
Anda dapat menambahkan --colorparameter untuk warna acaralso() { ls -alG "$@" --color | 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}'; }
tagplus5
1
sudahkah Anda menemukan solusi untuk masalah setuid / setgid yang lengket sejak memposting ini?
Silvestris
21

Cukup rentangkan \ penyederhanaan jawaban terkait 'stat' sebelumnya:

Anda cukup menjalankan:

stat <path_to_file>

Output akan berisi izin oktal bersama dengan info lainnya.



Detail (versi dan contoh stat):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: `/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

Perhatikan: ( 0644 / -rw-r - r--)

Vano
sumber
6

Untuk portabilitas, Anda dapat menggunakan perl:

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

Jika Anda ingin melihat ketika kesalahan terjadi, coba:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt
cuonglm
sumber
2
Selain menjadi portabel, solusi @ cuonglm menunjukkan empat karakter oktal daripada tiga , sehingga menunjukkan keadaan "sedikit lengket" yang sering dilupakan.
jfmercer
2

Anda bisa menggunakannya finddengan -printfaksi.

lstidak menampilkan izin oktal, tetapi Anda dapat menggunakan findsolusi berbasis- ini :

find path -printf "%m:%f\n"

Misalnya, untuk memeriksa direktori Video saya:

$ find Videos -printf "%m:%f\n"
755:Videos

The %mFormat specifier menceritakan -printftindakan untuk mencetak izin oktal, sedangkan %fformat specifier menyebabkan ia mencetak nama file.

Anda dapat meneruskan beberapa nama file ke find. Anda bahkan dapat menggunakan gumpalan (misalnya, find * -printf "%m:%f\n").

Anda tidak harus menggunakan tes seperti -nameatau -iname; cukup untuk meneruskan nama file atau direktori yang Anda minati sebagai titik awal find. Artinya, berikan nama mereka sebagai argumen segera setelah kata find, seperti yang ditunjukkan di atas.

findmemberi Anda kontrol besar atas bagaimana ia menunjukkan output. Ada dua modifikasi khususnya yang mungkin berguna bagi Anda:

  • Secara default, findsubdirektori berulang, mirip dengan ls -R. Jika Anda tidak ingin findmengunjungi subdirektori dari titik awal yang Anda lewati, Anda dapat menambahkan -maxdepth 0(atau menggunakan -maxdepthdengan nilai lain untuk menunjukkan seberapa dalam Anda menginginkannya).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %fhanya menampilkan nama file, jadi jika findharus berulang untuk sampai ke file, Anda mungkin tidak tahu di mana ia berada. Untuk menunjukkan jalur, dimulai dengan titik awal mana saja file ditemukan di bawah, gunakan %psaja.

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

Lihat man finduntuk informasi lebih lanjut tentang menggunakan findperintah.

Metode Lain ( lsdan awk)

Ini dapat digunakan untuk membuat daftar semua file direktori dengan izinnya:

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}'

Ini pada dasarnya adalah perintah yang sama seperti pada alias Adam Courtemanchelso , yang dikutip oleh jawabannya , jalankan sebagai satu perintah. Jika Anda hanya menggunakan ini sekali, atau pada kesempatan langka, maka Anda mungkin tidak ingin repot menulisnya sebagai fungsi alias atau shell.

Maythux
sumber