Відповіді:
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
, але може працювати в крайньому випадку.