Disons que j'ai la sortie suivante de ls -l
:
drwxr-xr-x 2 root root 4096 Apr 7 17:21 foo
Comment puis-je convertir automatiquement cela au format utilisé par chmod
?
Par exemple:
$ echo drwxr-xr-x | chmod-format
755
J'utilise OS X 10.8.3.
permissions
ls
chmod
Tyilo
la source
la source
stat
. L'avez vous? (C'est un outil GNU, donc principalement disponible sur Linux, pas sur Unix.)stat foo
donne16777219 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
. Je n'y vois pas755
.Réponses:
Certains systèmes ont des commandes pour afficher les autorisations d'un fichier sous forme de nombre, mais malheureusement, rien de portable.
zsh
a unstat
(akazstat
) intégré dans lestat
module:Ensuite, le
mode
est dans$s[mode]
mais est le mode, c'est-à-dire type + perms.Si vous souhaitez que les autorisations soient exprimées en octal, vous avez besoin de:
Les BSD (y compris Apple OS / X ) ont également une
stat
commande.GNU find (d'aussi loin que 1990 et probablement avant) peut imprimer les autorisations en octal:
Plus tard (2001, longtemps après
zsh
stat
(1997) mais avant BSDstat
(2002)) unestat
commande GNU a été introduite avec à nouveau une syntaxe différente:Bien avant ceux-ci, IRIX avait déjà une
stat
commande (déjà là dans IRIX 5.3 en 1994) avec une autre syntaxe:Encore une fois, lorsqu'il n'y a pas de commande standard, le meilleur pari pour la portabilité est d'utiliser
perl
:la source
Vous pouvez demander à GNU
stat
de sortir les autorisations au format octal en utilisant l'-c
option. Deman stat
:Donc dans votre cas:
Ou vous pouvez même l'automatiser en formatant
stat
la sortie en tant que commande valide:La solution ci-dessus fonctionnera également pour plusieurs fichiers si vous utilisez un caractère générique:
Fonctionnera correctement avec les noms de fichiers contenant des espaces, mais échouera avec les noms de fichiers contenant des guillemets simples.
la source
stat
n'a pas d'-c
option. J'utilise OS X 10.8.3.stat -f 'chmod %p "%N"'
Pour passer de la notation symbolique à la notation octale, j'ai une fois trouvé :
Étendu:
Cela renvoie le nombre octal de la sortie de
ls -l
sur un fichier.la source
dpkg
pour redéfinir les autorisations sur "tel qu'installé". Merci d'avoir répondu à la question littérale sans tenir compte de la commande qui a produit la chaîne d'autorisation.Cette commande sur Mac sous sh
si vous souhaitez uniquement l'autorisation numérique, utilisez% Lp uniquement.
par exemple:
Le 700 est l'autorisation numérique qui peut être utilisée dans chmod, et Desktop est le nom de fichier.
la source
Voici une réponse à la question Y (en ignorant la question X ), inspirée de la tentative du PO:
Ce qui précède contient quelques bashismes. La version suivante semble être compatible POSIX:
Remarques:
LC_COLLATE=C
dit au shell de traiter les modèles de plage de séquence de lettres comme utilisant l'ordre ASCII,[a-e]
est donc équivalent à[abcde]
. Dans certains paramètres régionaux (par exemple, en_US),[a-e]
est équivalent à[aAbBcCdDeE]
(c.- à -d.[abcdeABCDE]
) Ou peut[abcdeABCD]
- être - voir Pourquoi l'instruction bash case n'est pas sensible à la casse…? )Dans la deuxième version (celle compatible POSIX):
La première
case
déclaration pourrait être réécrite:mais je pense que la façon dont je l'ai maintenant permet de voir plus facilement que
l
la lettre est traitée différemment. Alternativement, il pourrait être réécrit:depuis
r
,w
,x
,s
ett
sont les seules lettres qui devraient jamais apparaître dans une chaîne de mode (autre quel
).La deuxième
case
déclaration pourrait être réécrite:pour appliquer la règle selon laquelle seules les lettres sont valides pour spécifier les bits de mode. (En revanche, la version la plus succincte du script complet est paresseuse et acceptera
-rw@rw#rw%
comme équivalente àrwSrwSrwT
.) Alternativement, elle pourrait être réécrite:depuis
S
,s
,T
,t
,L
etl
sont les seules lettres qui devraient jamais apparaître dans une chaîne de mode (autres quer
,w
etx
).Usage:
Et, oui, je sais qu'il vaut mieux ne pas utiliser
echo
avec du texte qui pourrait commencer-
; Je voulais juste copier l'exemple d'utilisation de la question. Notez, bien entendu, que cela ignore le 0ème caractère (c'est-à-dire le premierd
/b
/c
/-
/l
/p
/s
/D
) et le 10ème (+
/.
/@
). Il suppose que les mainteneurs dels
ne définiront jamaisr
/R
ouw
/W
comme des caractères valides en troisième, sixième ou neuvième position (et, s'ils le font, ils devraient être battus avec des bâtons ).En outre, je viens de trouver le code suivant, par cas , sous Comment restaurer la propriété par défaut du groupe / utilisateur de tous les fichiers sous / var :
J'ai testé ce code (mais pas complètement), et il semble fonctionner, sauf qu'il ne reconnaît pas
l
ouL
en sixième position. Notez, cependant, que bien que cette réponse soit supérieure en termes de simplicité et de clarté, la mienne est en fait plus courte (en comptant uniquement le code à l' intérieur de la boucle; le code qui gère une seule-rwxrwxrwx
chaîne, sans compter les commentaires), et elle pourrait être encore plus courte en remplaçant par .if condition; then …
condition && …
Bien sûr, vous ne
ls
devez pas analyser la sortie de .la source
#!/bin/sh
puis utilisé quelques bashismes. Oups. Mais vous en avez raté quelques-uns: et ne semblez pas non plus être POSIX (le Standard ne le mentionne pas du tout, et est écervelé et ). Inversement, je n'ai pas utilisé ; qui apparaît uniquement dans CAS réponse de l », que je citais d' ici . De plus, ma réponse gère les «l» et «L», et j'ai déjà souligné le fait que la réponse de cas ne le fait pas.$((
variable++
))
$((
number
**
number
))
**
++
--
[[…]]
$((- -a))
si vous voulez une double négation, pas que vous pouvez utiliser$((--a))
pour signifier une opération de décrémentation.seq
ne s'agit pas d'une commande POSIX. Vous pourrez peut-être utiliser l'opérateur $ {var #?} Pour éviter expr. Non pas que LC_COLLATE n'écrase pas LC_ALL8
«ou9
», et aucun moyen d'obtenir plus que7
dans n'importe quelle position décimale, il peut tirer de la mascarade. …………………… (Ce commentaire est une réponse à un commentaire de Stéphane Chazelas qui a disparu.)Si votre objectif est de prendre les permissions d'un fichier et de les donner à un autre également, GNU a
chmod
déjà une option "référence" pour cela .la source
chmod
n'y aura donc pas de GNUchmod
.Une alternative, si vous souhaitez enregistrer les autorisations, pour les restaurer plus tard, ou sur un fichier différent est à utiliser
setfacl/getfacl
, et il restituera également (ACL POSIX) en tant que bonus.(sous Solaris, utilisez
-f
plutôt que-M
).Cependant, bien qu'ils soient disponibles sur certains BSD, ils ne le sont pas sur Apple OS / X où les ACL sont manipulées
chmod
uniquement.la source
Sur Mac OS X (10.6.8), vous devez utiliser
stat -f format
(car il s'agit en fait de NetBSD / FreeBSDstat
).Pour traduire simplement une chaîne d'autorisation symbolique produite par
ls -l
en octal (en utilisant uniquement les commandes internes du shell), voir: showperm.bash .la source