Powiedz, że mam następujące dane wyjściowe z ls -l
:
drwxr-xr-x 2 root root 4096 Apr 7 17:21 foo
Jak mogę automatycznie przekonwertować to na format używany przez chmod
?
Na przykład:
$ echo drwxr-xr-x | chmod-format
755
Używam OS X 10.8.3.
permissions
ls
chmod
Tyilo
źródło
źródło
stat
. Masz to? (Jest to narzędzie GNU, więc jest dostępne głównie w Linuksie, a nie w Uniksie).stat foo
daje16777219 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
. Nie widzę755
w tymOdpowiedzi:
Niektóre systemy mają polecenia do wyświetlania uprawnień do pliku jako liczby, ale niestety nic przenośnego.
zsh
mastat
(akazstat
) wbudowany wstat
moduł:Następnie
mode
jest$s[mode]
jednak to tryb, który jest typu + perms.Jeśli chcesz uprawnienia wyrażone ósemkowo, potrzebujesz:
BSD (w tym Apple OS / X ) również mają
stat
polecenie.GNU find (już od 1990 roku i prawdopodobnie wcześniej) może wydrukować uprawnienia w postaci ósemkowej:
Później (2001, długo po
zsh
stat
(1997), ale przed BSDstat
(2002)) wprowadzonostat
komendę GNU z inną składnią:Na długo przed nimi IRIX miał już
stat
komendę (już w IRIX 5.3 w 1994) z inną składnią:Ponownie, gdy nie ma standardowego polecenia, najlepszym wyborem dla przenośności jest użycie
perl
:źródło
Możesz poprosić GNU
stat
o wyświetlanie uprawnień w formacie ósemkowym, korzystając z-c
opcji. Odman stat
:Więc w twoim przypadku:
Lub możesz to zautomatyzować, formatując
stat
dane wyjściowe jako prawidłowe polecenie:Powyższe rozwiązanie będzie działać również w przypadku wielu plików, jeśli używasz znaku wieloznacznego:
Działa poprawnie z nazwami plików zawierającymi znaki spacji, ale zawiedzie w przypadku nazw plików zawierających pojedyncze cudzysłowy.
źródło
stat
nie ma-c
opcji. Używam OS X 10.8.3.stat -f 'chmod %p "%N"'
Aby przekonwertować notację symboliczną na ósemkową, kiedyś wpadłem na pomysł :
Rozszerzony:
Zwraca liczbę ósemkową z wyniku
ls -l
jednego pliku.źródło
dpkg
aby ustawić uprawnienia z powrotem na „jak zainstalowane”. Dziękujemy za odpowiedź na dosłowne pytanie, bez względu na to, które polecenie wygenerowało ciąg uprawnień.To polecenie na Macu pod sh
jeśli chcesz tylko uprawnienia numerycznego, użyj tylko% Lp.
na przykład:
700 to uprawnienie numeryczne, którego można używać w chmod, a Desktop to nazwa pliku.
źródło
Oto odpowiedź na pytanie Y (ignorując pytanie X ), zainspirowana próbą OP:
Powyższe zawiera kilka baszizmów. Następująca wersja wydaje się być zgodna z POSIX:
Uwagi:
LC_COLLATE=C
Mówi powłoce na pismo traktować jako sekwencja zakres wzorców korzystania kolejność ASCII, więc[a-e]
jest równoważna[abcde]
. W niektórych lokalizacjach (np. En_US)[a-e]
jest równoważne[aAbBcCdDeE]
(tj.[abcdeABCDE]
), A może[abcdeABCD]
- zobacz Dlaczego w instrukcji bash wielkość liter nie jest rozróżniana…? )W drugiej wersji (zgodnej z POSIX):
Pierwsze
case
zdanie można przepisać:ale myślę, że sposób, w jaki go mam, ułatwia teraz dostrzeżenie, że
l
list jest traktowany inaczej. Alternatywnie można go przepisać:ponieważ
r
,w
,x
,s
, it
są tylko litery, które powinny zawsze pojawiają się w ciąg trybie (innym niżl
).Drugie
case
zdanie można przepisać:aby wymusić regułę, że tylko litery są poprawne przy określaniu bitów trybu. (Natomiast bardziej zwięzła wersja pełnego skryptu jest leniwa i zaakceptuje
-rw@rw#rw%
jako równoważnąrwSrwSrwT
.) Alternatywnie można ją przepisać:ponieważ
S
,s
,T
,t
,L
, il
są tylko litery, które powinny zawsze pojawiają się w ciąg tryb (inne niżr
,w
ix
).Stosowanie:
I tak, wiem, że lepiej nie używać
echo
tekstu, który może zaczynać się od-
; Chciałem po prostu skopiować przykład użycia z pytania. Zauważ oczywiście, że ignoruje to znak 0 (tj. Wiodącyd
/b
/c
/-
/l
/p
/s
/D
) i 10. (+
/.
/@
). Zakłada się, że opiekunowiels
nigdy nie zdefiniująr
/R
lubw
/W
jako prawidłowych znaków na trzeciej, szóstej lub dziewiątej pozycji (a jeśli tak, powinni zostać pobici kijami ).Właśnie znalazłem następujący kod, według cas , w części Jak przywrócić domyślną własność grupy / użytkownika dla wszystkich plików w katalogu / var :
Przetestowałem ten kod (ale nie do końca) i wydaje się, że działa, poza tym, że nie rozpoznaje
l
ani nie zajmujeL
szóstej pozycji. Zauważ jednak, że chociaż ta odpowiedź jest lepsza pod względem prostoty i przejrzystości, moja jest w rzeczywistości krótsza (licząc tylko kod w pętli; kod, który obsługuje pojedynczy-rwxrwxrwx
ciąg, nie licząc komentarzy), i może być jeszcze krótsza zastępując z .if condition; then …
condition && …
Oczywiście nie powinieneś analizować wyniku
ls
.źródło
#!/bin/sh
a potem użyłem kilku bachizmów. Ups Ale przegapiłeś parę: i nie wydajesz się być POSIX (Standard w ogóle nie wspomina , i jest wiewiórki i ). Z drugiej strony, ja nie używać ; który pojawia się tylko w cas odpowiedź „s, które cytowany z tutaj . Również moja odpowiedź radzi sobie „L” i „L”, a ja już zwrócił uwagę na fakt, że odpowiedź TAS nie.$((
variable++
))
$((
number
**
number
))
**
++
--
[[…]]
$((- -a))
jeśli chcesz podwójnej negacji, a nie, że możesz użyć tego,$((--a))
by oznaczać operację zmniejszania.seq
to nie jest polecenie POSIX. Możesz być w stanie użyć operatora $ {var #?}, Aby uniknąć wyrażenia. Nie to, że LC_COLLATE nie zastąpi LC_ALL8
„s lub9
” s, a nie sposób, aby uzyskać więcej niż7
w dowolnej pozycji dziesiętnych, może wyciągnąć z farsy. …………………… (Ten komentarz jest odpowiedzią na komentarz Stéphane Chazelas, który zniknął.)Jeśli twoim celem jest pobranie uprawnień z jednego pliku i przekazanie ich także do innego, GNU
chmod
ma już opcję „referencyjną” .źródło
chmod
nie będziechmod
tam GNU .Alternatywą jest użycie opcji, jeśli chcesz zapisać uprawnienia w celu ich późniejszego przywrócenia lub w innym pliku
setfacl/getfacl
, a także przywrócić listy ACL (POSIX-draft) jako bonus.(w systemie Solaris użyj
-f
zamiast-M
).Jednak chociaż są one dostępne w niektórych BSD, nie są one w systemie Apple OS / X, w którym manipulowane są
chmod
tylko listy ACL .źródło
W systemie Mac OS X (10.6.8) musisz użyć
stat -f format
(ponieważ w rzeczywistości jest to NetBSD / FreeBSDstat
).Aby po prostu przetłumaczyć symboliczny ciąg uprawnień wytworzony przez
ls -l
na ósemkę (używając tylko wbudowanych powłok) zobacz: showperm.bash .źródło