Katakanlah saya memiliki output berikut dari ls -l
:
drwxr-xr-x 2 root root 4096 Apr 7 17:21 foo
Bagaimana saya bisa mengonversikan ini secara otomatis ke format yang digunakan oleh chmod
?
Sebagai contoh:
$ echo drwxr-xr-x | chmod-format
755
Saya menggunakan OS X 10.8.3.
permissions
ls
chmod
Tyilo
sumber
sumber
stat
. Apakah kamu memilikinya? (Ini alat GNU, jadi sebagian besar tersedia di Linux, bukan di Unix.)stat foo
memberi16777219 377266 drwxr-xr-x 119 Tyilo staff 0 4046 "Apr 7 17:49:03 2013" "Apr 7 18:08:31 2013" "Apr 7 18:08:31 2013" "Nov 25 17:13:52 2012" 4096 0 0 /Users/Tyilo
. Saya tidak melihat755
di dalamnya.Jawaban:
Beberapa sistem memiliki perintah untuk menampilkan izin file sebagai angka, tetapi sayangnya, tidak ada yang portabel.
zsh
memilikistat
(aliaszstat
) builtin dalamstat
modul:Kemudian,
mode
is in$s[mode]
tetapi adalah mode, yaitu ketik + perms.Jika Anda ingin izin dinyatakan dalam oktal, Anda perlu:
BSD (termasuk Apple OS / X ) juga memiliki
stat
perintah.GNU find (dari tahun 1990 dan mungkin sebelumnya) dapat mencetak izin sebagai oktal:
Kemudian (2001, jauh setelah
zsh
stat
(1997) tetapi sebelum BSDstat
(2002)) sebuahstat
perintah GNU diperkenalkan dengan sintaks yang berbeda lagi:Jauh sebelum itu, IRIX sudah memiliki
stat
perintah (sudah ada di IRIX 5.3 pada tahun 1994) dengan sintaks lain:Sekali lagi, ketika tidak ada perintah standar, taruhan terbaik untuk portabilitas adalah dengan menggunakan
perl
:sumber
Anda dapat meminta GNU
stat
untuk mengeluarkan izin dalam format oktal dengan menggunakan-c
opsi. Dariman stat
:Jadi dalam kasus Anda:
Atau Anda bahkan dapat mengotomatisasi dengan memformat
stat
output sebagai perintah yang valid:Solusi di atas juga akan berfungsi untuk banyak file jika menggunakan wildcard:
Akan bekerja dengan benar dengan nama file yang mengandung karakter spasi, tetapi akan gagal pada nama file yang mengandung tanda kutip tunggal.
sumber
stat
tidak punya-c
pilihan. Saya menggunakan OS X 10.8.3.stat -f 'chmod %p "%N"'
Untuk mengkonversi dari notasi simbolis ke oktal, saya pernah muncul dengan:
Diperluas:
Itu mengembalikan angka oktal dari output
ls -l
pada satu file.sumber
dpkg
untuk mengatur izin kembali ke "sebagaimana diinstal". Terima kasih telah menjawab pertanyaan literal tanpa memperhatikan perintah yang menghasilkan string izin.Perintah ini pada Mac di bawah sh
jika Anda hanya menginginkan izin numerik, gunakan% Lp saja.
sebagai contoh:
700 adalah izin numerik yang dapat digunakan dalam chmod, dan Desktop adalah nama file.
sumber
Inilah jawaban untuk pertanyaan Y (mengabaikan pertanyaan X ), terinspirasi oleh upaya OP:
Di atas mengandung beberapa bashism. Versi berikut ini tampaknya kompatibel dengan POSIX:
Catatan:
LC_COLLATE=C
menceritakan shell surat memperlakukan pola urutan rentang dengan menggunakan urutan ASCII, sehingga[a-e]
setara dengan[abcde]
. Di beberapa lokal (misalnya, en_US),[a-e]
setara dengan[aAbBcCdDeE]
(yaitu,[abcdeABCDE]
) atau mungkin[abcdeABCD]
- lihat Mengapa pernyataan bash case tidak peka terhadap huruf besar-kecil ...? )Dalam versi kedua (yang kompatibel dengan POSIX):
case
Pernyataan pertama dapat ditulis ulang:tapi saya pikir cara saya sekarang membuatnya lebih mudah untuk melihat bahwa
l
surat itu ditangani secara berbeda. Atau, dapat ditulis ulang:sejak
r
,w
,x
,s
, dant
adalah satu-satunya huruf yang harus pernah muncul dalam string modus (selainl
).case
Pernyataan kedua dapat ditulis ulang:untuk menegakkan aturan bahwa hanya huruf yang valid untuk menentukan bit mode. (Sebaliknya, versi yang lebih ringkas dalam skrip lengkap adalah malas, dan akan menerima
-rw@rw#rw%
setara denganrwSrwSrwT
.) Atau, dapat ditulis ulang:sejak
S
,s
,T
,t
,L
, danl
adalah satu-satunya huruf yang harus pernah muncul dalam modus tali (selainr
,w
, danx
).Pemakaian:
Dan, ya, saya tahu lebih baik tidak menggunakan
echo
teks yang mungkin dimulai dengan-
; Saya hanya ingin menyalin contoh penggunaan dari pertanyaan. Perhatikan, jelas, bahwa ini mengabaikan karakter 0 (yaitu, yang memimpind
/b
/c
/-
/l
/p
/s
/D
) dan 10 (+
/.
/@
). Ini mengasumsikan bahwa pengelolals
tidak akan pernah mendefinisikanr
/R
atauw
/W
sebagai karakter yang valid di posisi ketiga, keenam, atau kesembilan (dan, jika mereka melakukannya, mereka harus dipukuli dengan tongkat ).Juga, saya baru saja menemukan kode berikut, menurut cas , di bawah Cara mengembalikan kepemilikan grup / pengguna default semua file di bawah / var :
Saya telah menguji kode ini (tetapi tidak sepenuhnya), dan tampaknya berhasil, kecuali kenyataan bahwa ia tidak mengenali
l
atau beradaL
di posisi keenam. Perhatikan, meskipun jawaban ini lebih unggul dalam hal kesederhanaan dan kejelasan, saya sebenarnya lebih pendek (hanya menghitung kode di dalam loop; kode yang menangani-rwxrwxrwx
string tunggal , tidak menghitung komentar), dan itu bisa dibuat lebih pendek dengan mengganti dengan .if condition; then …
condition && …
Tentu saja, Anda tidak perlu menguraikan output
ls
.sumber
#!/bin/sh
dan kemudian menggunakan beberapa bashism. Ups. Tapi Anda melewatkan beberapa: dan tidak tampaknya POSIX baik (Standard tidak menyebutkan sama sekali, dan squirrelly pada dan ). Sebaliknya, saya tidak menggunakan ; yang muncul hanya dalam jawaban cas , yang saya kutip dari sini . Juga, jawaban saya tidak menangani 'l' dan 'L', dan saya sudah menunjukkan fakta bahwa jawaban cas tidak.$((
variable++
))
$((
number
**
number
))
**
++
--
[[…]]
$((- -a))
jika Anda ingin negasi ganda, bukan yang Anda gunakan$((--a))
untuk berarti operasi pengurangan.seq
ini bukan perintah POSIX. Anda mungkin dapat menggunakan operator $ {var #?} Untuk menghindari expr. Bukan berarti LC_COLLATE tidak akan menimpa LC_ALL8
atau tidak9
, dan tidak ada cara untuk mendapatkan lebih dari7
pada posisi desimal apa pun, ia dapat menarik sandiwara itu. ... ... ... ... ... ... ... ... (Komentar ini adalah tanggapan atas komentar Stéphane Chazelas yang menghilang.)Jika tujuan Anda adalah untuk mengambil izin dari satu file dan memberikannya ke yang lain juga, GNU
chmod
sudah memiliki opsi "referensi" untuk itu .sumber
chmod
tidak akanchmod
ada GNU di sana.Alternatif, jika Anda ingin menyimpan izin, mengembalikannya nanti, atau menggunakan file lain
setfacl/getfacl
, dan juga mengembalikan (POSIX-draft) ACL sebagai bonus.(pada Solaris, gunakan
-f
bukan-M
).Namun, meskipun mereka tersedia di beberapa BSD, mereka tidak ada di Apple OS / X di mana ACL hanya dimanipulasi
chmod
.sumber
Pada Mac OS X (10.6.8) Anda harus menggunakan
stat -f format
(karena itu sebenarnya NetBSD / FreeBSDstat
).Untuk hanya menerjemahkan string izin simbolis yang dihasilkan oleh
ls -l
menjadi oktal (hanya menggunakan builtin shell) lihat: showperm.bash .sumber