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

Я использую обоих регулярно. Я представление Emacs как "живой в" редакторе, тогда как я использую Vim для быстрых, одноразовых задач. Поверхностно, Emacs намного более чрезмерно увеличен в размере, чем Vim, и таким образом, действительно не вполне столь же удобно "Разжечь" как Vim, но я также нахожу что основные положения пользовательского интерфейса от одного до другой поддержки эта парадигма. Emacs намного более создается для держания Вас внутри, делая вещи хорошими и удобными, таким образом, Вы не должны уезжать, тогда как энергия является намного большим количеством "Unixy" и рассматривает себя как часть большего пояса инструмента.

Многие люди бегут из Emacs из-за его сильной зависимости от маркерных битов, но это - довольно глупая причина для меня. Действительная мощность, которую Emacs имеет по Vim, является настраиваемостью, и с питанием Гадюки и т.д., это действительно не проблема. Конечно, Сценарий Vim обеспечивает свой собственный уровень настройки, и если бы, скажем, Вашему любимому языку программирования не предоставили соответствующий маркер синтаксиса, то Вы могли бы, конечно, приготовить тот, но Emacs является в конечном счете LISP-компьютером самохостинга, и в конце можно сделать много, намного больше игры с ним. Просто нет таких инструментов как гну или org-режим в Vim, для именования некоторых. Короче говоря Emacs не является просто редактором, это - практически проклятая операционная система бога.

Для управления текстом я сказал бы, что они точно на одном уровне.

63
21.02.2011, 01:32
4 ответа

stat от GNU coreutils может сделать это:

stat -c '%U' /path/of/file/or/directory

К сожалению, существует много версий stat, и нет большой непротиворечивости в их синтаксисе. Например, на FreeBSD, это было бы

stat -f '%Su' /path/of/file/or/directory

Если мобильность является беспокойством, Вы - вероятно, более обеспеченное предложение Gilles использования объединения ls и awk. Это должно запустить два процесса вместо одного, но это имеет преимущество использования только стандартной POSIX функциональности:

ls -ld /path/of/file/or/directory | awk '{print $3}'
104
27.01.2020, 19:32
  • 1
    c %U / путь, если краткость является премией. –  tsvallender 21.02.2011, 01:18
  • 2
    Это принимает статистику GNU, которая не имеет место в более старых системах Linux (даже в более новых системах, я был бы осторожен, могло бы быть другое stat (по всему сайту стандарт) в /usr/local/bin или где-нибудь в доме пользователя), и редко доступно на других нельдах. –  Gilles 'SO- stop being evil' 21.02.2011, 01:18
  • 3
    stat -c %U имеет преимущество также работы с BusyBox, если stat команда компилируется в. –  Gilles 'SO- stop being evil' 21.02.2011, 02:23
  • 4
    Хороший, последний пример (ls) работает и над Unix/OSX и над Linux –  kenorb 28.11.2013, 17:52
  • 5
    Примечание, что ls распечатает uid, если не будет никакого локального пользователя, соответствующего владельцу (т.е. на сетевом ресурсе), но stat -c '%U' DIR распечатает UNKNOWN, который является менее полезным или более соответствующим, в зависимости от того, как Вы смотрите на него. –  basic6 14.05.2014, 11:59

Парсинг вывода ls редко хорошая идея, но получение первых нескольких полей является исключением, оно на самом деле работает над всеми “традиционными” нельдами (оно не работает над платформами, такими как некоторые реализации Windows, которые позволяют пробелы в именах пользователей).

ls -ld /path/to/directory | awk 'NR==1 {print $3}'

Другая опция состоит в том, чтобы использовать a 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
19
27.01.2020, 19:32
  • 1
    Существуют некоторые протесты с ls | awk приблизьтесь, слишком к сожалению, как я отметил здесь. Я еще не предложил решение для, "конечный файл / dir является символьной ссылкой с другим именем", выходят, я упомянул в своем недавнем комментарии. спасибо –  beporter 15.07.2014, 20:16
  • 2
    Вместо find . -user "$username" -print -prune -o -prune Вы могли просто сделать find . -maxdepth 0 -user "$username" –  Niklas Holm 09.12.2016, 14:18

Можно также сделать, это с GNU находит:

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

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

9
27.01.2020, 19:32
  • 1
    Это работает над каждой невстроенной системой Linux и немногими другими (например, Cygwin). Встроенные системы, вероятно, будут иметь Busybox, чей find не имеет -printf. –  Gilles 'SO- stop being evil' 21.02.2011, 02:22
  • 2
    Как я сказал, система GNU. –  mattdm 21.02.2011, 03:24
  • 3
    без GNU coreutils (такие как FreeBSD) не имеет -printf :-(. –  pevik 15.03.2016, 23:38
  • 4
    @pevik Да, как я сказал, все еще. Но можно установить GNU, находят, нужен ли Вам он. :) –  mattdm 15.03.2016, 23:44
  • 5
    @mattdm: не всегда :-(. самое главное, когда Вы пишете сценарии, которые должны быть портативными. –  pevik 16.03.2016, 00:27

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

3
27.01.2020, 19:32

Теги

Похожие вопросы