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