Скажем, у меня есть следующий вывод ls -l
:
drwxr-xr-x 2 root root 4096 Apr 7 17:21 foo
Как я могу автоматически преобразовать это в используемый формат chmod
?
Например:
$ echo drwxr-xr-x | chmod-format
755
Я использую OS X 10.8.3.
permissions
ls
chmod
Tyilo
источник
источник
stat
. У тебя есть это? (Это инструмент GNU, так что в основном он доступен в Linux, а не в Unix.)stat foo
дает16777219 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
. Я не вижу755
в этом.Ответы:
В некоторых системах есть команды для отображения прав доступа к файлу в виде числа, но, к сожалению, ничего переносимого.
zsh
имеетstat
(иначеzstat
) встроенный вstat
модуль:Затем,
mode
это в,$s[mode]
но это режим, то есть тип + перми.Если вы хотите, чтобы разрешения были выражены в восьмеричном виде, вам необходимо:
У BSD (включая Apple OS / X ) также есть
stat
команда.GNU find (начиная с 1990 года и, возможно, раньше) может печатать разрешения в восьмеричном виде:
Позже (2001, намного позже
zsh
stat
(1997), но до BSDstat
(2002))stat
была введена команда GNU с другим синтаксисом:Задолго до этого у IRIX уже была
stat
команда (уже существовавшая в IRIX 5.3 в 1994 году) с другим синтаксисом:Опять же, когда нет стандартной команды, лучшим вариантом для переносимости является использование
perl
:источник
Вы можете попросить GNU
stat
вывести разрешения в восьмеричном формате, используя-c
опцию. Отman stat
:Итак, в вашем случае:
Или вы можете даже автоматизировать его, отформатировав
stat
вывод как допустимую команду:Приведенное выше решение также будет работать для нескольких файлов, если используется подстановочный знак:
Будет корректно работать с именами файлов, содержащими пробельные символы, но не будет работать с именами файлов, содержащими одинарные кавычки.
источник
stat
нет-c
выбора. Я использую OS X 10.8.3.stat -f 'chmod %p "%N"'
Чтобы перейти от символьной к восьмеричной записи, я однажды придумал :
Expanded:
Это возвращает восьмеричное число из вывода
ls -l
одного файла.источник
dpkg
для установки разрешений обратно "как установлено". Спасибо за ответ на буквальный вопрос, независимо от того, какая команда выдала строку разрешения.Эта команда на Mac под sh
если вам нужно только числовое разрешение, используйте только% Lp.
например:
700 - это числовое разрешение, которое можно использовать в chmod, а Desktop - это имя файла.
источник
Вот ответ на вопрос Y (игнорируя вопрос X ), вдохновленный попыткой ОП:
Вышесказанное содержит несколько башмизмов. Следующая версия кажется POSIX-совместимой:
Примечания:
LC_COLLATE=C
велит оболочке обрабатывать шаблоны диапазонов буквенных последовательностей, используя порядок ASCII, что[a-e]
эквивалентно[abcde]
. В некоторых локалях (например, en_US)[a-e]
эквивалентно[aAbBcCdDeE]
(т. Е.[abcdeABCDE]
) Или, возможно,[abcdeABCD]
- см. Почему оператор bash не учитывает регистр…? )Во второй версии (POSIX-совместимой):
Первое
case
утверждение можно переписать так:но я думаю, что то, что у меня есть сейчас, облегчает понимание того, что
l
письмо обрабатывается по-другому. В качестве альтернативы, это может быть переписано:так как
r
,w
,x
,s
иt
являются только буквы , которые должны всегда появляться в строке режима (кромеl
).Второе
case
утверждение можно переписать так:обеспечить соблюдение правила о том, что для указания битов режима допустимы только буквы. (Напротив, более краткая версия в полном сценарии является ленивой и будет восприниматься
-rw@rw#rw%
как эквивалентнаяrwSrwSrwT
.) В качестве альтернативы ее можно переписать:так как
S
,s
,T
,t
,L
, иl
являются только буквы , которые должны всегда появляться в строке режима (кромеr
,w
иx
).Использование:
И да, я знаю, что лучше не использовать
echo
текст, который может начинаться с-
; Я просто хотел скопировать пример использования из вопроса. Очевидно, обратите внимание, что это игнорирует 0-й символ (то есть, ведущийd
/b
/c
/-
/l
/p
/s
/D
) и 10-й (+
/.
/@
). Предполагается, что сопровождающиеls
никогда не будут определятьr
/R
илиw
/W
как действительные символы в третьей, шестой или девятой позиции (и, если они это сделают, их следует бить палками ).Кроме того, я только что нашел следующий код от cas в разделе Как восстановить групповое / пользовательское владение всеми файлами по умолчанию в / var :
Я проверил этот код (но не полностью), и он, кажется, работает, за исключением того факта, что он не распознает
l
или находитсяL
на шестой позиции. Тем не менее, обратите внимание, что хотя этот ответ является превосходным с точки зрения простоты и ясности, мой на самом деле короче (считая только код внутри цикла; код, который обрабатывает одну-rwxrwxrwx
строку, не считая комментариев), и его можно сделать еще короче заменив на .if condition; then …
condition && …
Конечно, вы не должны анализировать вывод
ls
.источник
#!/bin/sh
а затем использовал несколько шуток. К сожалению. Но вы пропустили пару: и , похоже, тоже не POSIX (Стандарт вообще не упоминается , а коротко и ). Наоборот, я не использовал ; который появляется только в Cas ответ «ы, которые я цитировал из здесь . Кроме того, мой ответ обрабатывает 'l' и 'L', и я уже указал на тот факт, что ответ cas не делает.$((
variable++
))
$((
number
**
number
))
**
++
--
[[…]]
$((- -a))
если хотите двойное отрицание, а не то, что вы можете использовать$((--a))
для обозначения операции декремента.seq
это не команда POSIX. Вы можете использовать оператор $ {var #?}, Чтобы избежать выражения expr. Не то чтобы LC_COLLATE не перекрывал LC_ALL8
«s», ни9
«s», и нет способа получить больше, чем7
в любой десятичной позиции, он может вырваться из шарады. ... ... ... ... ... ... ... ... (Этот комментарий является ответом на комментарий Stéphane Chazelas , который исчез.)Если ваша цель состоит в том, чтобы взять разрешения из одного файла и передать их другому, в GNU для этого
chmod
уже есть «справочная» опция .источник
chmod
GNUchmod
там не будет .В качестве альтернативы, если вы хотите сохранить разрешения, восстановить их позже или использовать другой файл, это также использование
setfacl/getfacl
списков ACL (черновик POSIX) в качестве бонуса.(на Солярисе используйте
-f
вместо-M
).Однако, хотя они доступны на некоторых BSD, они не на Apple OS / X, где манипулируют
chmod
только ACL .источник
В Mac OS X (10.6.8) вы должны использовать
stat -f format
(потому что это на самом деле NetBSD / FreeBSDstat
).Чтобы просто перевести символическую строку разрешений, созданную в,
ls -l
в восьмеричное значение (используя только встроенные функции оболочки), см. Showperm.bash .источник