23

Я хочу написать сценарий .sh для настройки некоторых разрешений для папок, но мне было интересно, могу ли я запустить что-то вроде:

chown -644 ./one;/two;/three

составлять список папок, а не вызывать его несколько раз.

Кроме того, был бы способ сократить список файлов и исключить некоторые другие, как, например:

chown -R -664 ./*;!./cache

Я надеюсь, что мои псевдо-командные строки имеют смысл.

4 ответа4

33

Почти все инструменты Unix принимают список файлов в качестве аргументов без опций. Как обычно, разные аргументы должны быть разделены пробелом:

chown 644 one two three

Во втором примере, если вы используете Bash, простой

chown -R 644 !(cache)

будет достаточно.

Этот подход требует расширенного сопоставления с образцом. Если он отключен, вы можете включить его

shopt -s extglob

Смотрите: Справочное руководство Bash # Pattern Matching

4

Составьте список имен файлов в mod-these.txt и затем запустите:

chmod g+w `cat mod-these.txt`

или используйте метод, описанный другими здесь:

chown 644 one two three

или перейдите в город с первым параметром, но измените каждую строку в файле (в этом примере: замените "/" (с пробелами перед) на "./"):

chmod g+w `sed 's/ \// .\//' update-writable.txt` 
2

регулярное выражение для победы!

использование find - лучший способ, который я могу придумать, за исключением использования регулярного выражения, которое может уже существовать в вашей конкретной оболочке или в приложении, которое вы используете сами. Сначала я попробовал:

touch one&touch two &touch three&find -name "one|two|three" -exec chown -644 {} \;

Но вы обнаружите, что труба не работает в этом случае. Еще одна печальная вещь для изучения ... как изучение chmod, chown, chgrp, et. и др. не поддерживает выбор / исключение нескольких файлов / регулярных выражений ...
Решение, которое я нашел:
https://stackoverflow.com/questions/19111067/regex-match-either-string-in-linux-find-command

find \( -name one -o -name two -o -name three \) -exec chown -644 {} \;

Итак, не так уж много регулярных выражений для выигрыша, но, по крайней мере, у нас есть способ внедрить список файлов в аргументы программы в один слой.

вы заметите, что вам нужно экранировать метасимволы () и добавить параметр -o для каждого дополнительного имени ...

другие ссылки и контент от меня, которые могут вас заинтересовать в ваших путешествиях:
Различные лакомые кусочки - заметки Корна Борна и друзей. - Сайт Дэйва Хорнера

Приветствия.
--dave

1

Если файлы, которые вы хотите изменить, находятся в одном каталоге, вы можете использовать их с нужным шаблоном.

например, мне нужно, чтобы все загруженные файлы .run в pwd были изменены на исполняемые:

chmod +x `ls *.run`

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .