По общему признанию, это более замысловато, но имеет преимущество в том, что оно более кроссплатформенное:
Пользователь:
\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, поэтому мы вернемся к инструментам, специфичным для платформы, если будем использовать это.