6

Я уверен, что это легко, но я не могу найти это.

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

так:

DIR="whatever"
GROUP=DIR groupname 
usermod -a -G $GROUP userx

2 ответа2

12

stat -c %g <file> (Linux)

stat -f %g <file> (BSD)

Вернет идентификатор группы для данного <file>

РЕДАКТИРОВАТЬ:

stat -c %G <file> (Linux)

stat -f %Sg <file> (BSD)

Вернет имя группы.

0

По общему признанию, это более замысловато, но имеет преимущество в том, что оно более кроссплатформенное:

Пользователь:

\ls -l "$(dirname $TARGET_FILE)" | grep -v '^l' | grep " $(basename $TARGET_FILE)\$" | awk '{ print $3 }'

Группа:

\ls -l "$(dirname $TARGET_FILE)" | grep -v '^l' | grep " $(basename $TARGET_FILE)\$" | awk '{ print $4 }'

Разбивая это:

  • Используйте \ls . Обратная косая черта позволяет избежать любых псевдонимов оболочки, которые могут устанавливать параметры по умолчанию, такие как -F .
  • Создайте список родительского каталога в формате -l ong для $TARGET_FILE .
  • grep -v '^l' удаляет любые символические ссылки, которые могут указывать на $TARGET_FILE из списка, и передает остальные.
  • Затем сузьте результаты до одной строки от ls, которая заканчивается $TARGET_FILE . Начальный ' ' (пробел) и конечный \$ важны, чтобы соответствовать полному базовому имени. (В противном случае могут old_file , file_new и file .)
  • Наконец, передайте awk единственную строку ls -l для целевого файла и выберите третий (или 4-й) разделенный пробелами элемент в качестве имени пользователя (или группы).

Обратите внимание, что эта реализация имеет проблемы с относительными каталогами. (Не пытайтесь запустить его там, где TARGET_FILE=../ например.) Я уверен, что это может быть усилено с помощью realpath , но это не доступно в OS X, поэтому мы вернемся к инструментам, специфичным для платформы, если будем использовать это.

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