it-swarm-ru.tech

Найти владельца каталога или файла, но только вернуть это и ничего больше

Я ищу команду, которая будет возвращать владельца каталога и только это - например, регулярное выражение, анализируя ls -lat команда или что-то подобное? Я хочу использовать результат в другом скрипте.

67
Jason

stat from 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}'
107
cjm

Анализ выходных данных 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
20
Gilles 'SO- stop being evil'

Это также можно сделать с помощью GNU find:

find $directoryname -maxdepth 0 -printf '%u\n'

Это не переносимо вне системы GNU), но я был бы удивлен, обнаружив дистрибутив Linux, где он не работает.

10
mattdm

В чистом 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, но может работать в крайнем случае.

2
codehearts