Відповіді:
stat з GNU coreutils можуть це зробити:
stat -c '%U' /path/of/file/or/directory
На жаль, існує ряд версій stat, і в їх синтаксисі не так багато узгодженості. Наприклад, на FreeBSD це було б
stat -f '%Su' /path/of/file/or/directory
Якщо портативність викликає занепокоєння, вам, ймовірно, краще скористатися пропозицією Джилла про поєднання lsта awk. Він повинен запустити два процеси замість одного, але має перевагу використання лише стандартних функцій POSIX:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat(стандарт для загального сайту) /usr/local/bin), і він рідко доступний про інші уніці.
stat -c '%U' DIRбуде друкувати UNKNOWN, що є менш корисним або більш доцільним, залежно від того, як ви його переглядаєте.
Розбір результатів lsрідко є хорошою ідеєю , але отримання перших кількох полів є винятком, воно фактично працює на всіх "традиційних" об'єднаннях (це не працює на платформах, таких як деякі Windows-операції, які дозволяють пробіли в іменах користувачів).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Інший варіант полягає у використанні statкоманди, але проблема з statоболонкою полягає в тому, що є кілька команд з різним синтаксисом, тому statв скрипті оболонки є нерепортажним (навіть через установки Linux).
Зауважте, тестування того, чи є власник даного користувача, є іншою пропозицією.
if [ -n "$(find . -user "$username" -print -prune -o -prune)" ]; then
echo "The current directory is owned by $username."
fi
if [ -n "$(find . -user "$(id -u)" -print -prune -o -prune)" ]; then
echo "The current directory is owned by the current user."
fi
ls | awkжаль, є деякі застереження з підходом, як я вже зазначив . Я ще не знайшов рішення для проблеми "цільовий файл / реж - це симпосилання з іншим ім'ям", про яку я згадував у своєму недавньому коментарі.
find . -user "$username" -print -prune -o -pruneви могли просто зробитиfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'замість просто awk '{print $3}'? Я не впевнений, навіщо NR==1це потрібно тут.
lsколи нова лінія на шляху викликає розбиття лінії на два (що, я вважаю, це крайній випадок, який ви намагаєтесь охопити)? У GNU ls(нова версія), BusyBox lsта FreeBSD lsповертається новий рядок як $'\n', ?і ?відповідно.
Можна також зробити це за допомогою пошуку GNU:
find $directoryname -maxdepth 0 -printf '%u\n'
Це не портативно за межами системи GNU, але я був би здивований, коли знайшов дистрибутив Linux там, де він не працює.
-printf:-(.
У чистому bash ви можете перетворити вихідний lsмасив у масив та індексувати його.
# (lrwxr-xr-x, 1, myuser, staff, 36, Oct, 21, 16:36, /path/to/file)
file_meta=($(ls -ld /path/to/file))
file_owner="${file_meta[2]}" # myuser
Це не так елегантно , як використання stat, findабо awk, але може працювати в крайньому випадку.