Использование `ls`, чтобы показать настоящее имя владельца файла

422
root

Пользователи Unix могут иметь свои настоящие имена, перечисленные в /etc/passwd/. Команда fingerможет отображать реальные имена. Можно ли ls -lпоказать эти настоящие имена владельцев файлов рядом с файлами?

Если lsне можете сделать это напрямую, то каков наилучший способ направить вывод ls -lчерез, fingerчтобы достичь этого результата? Звучит как работа для awk- используйте ls -l | fingerв качестве справочной таблицы для перезаписи третьего столбца ls -l.

(Связанный вопрос в случае, если настоящие имена не в, fingerа в таблице поиска: замена текста в таблице поиска в bash )

0
Почему вы задаете два отдельных вопроса? Похоже, вы пытаетесь решить одну проблему, и вы думали о двух подходах. Сравните [проблема XY] (https://meta.stackexchange.com/a/66378/355310). Было бы хорошо, если бы вы спросили о X один раз? и только упомянул, что ты думаешь, что Y1 или Y2 помогут. Возможно, лучшим решением будет какой-то Y3, которого никто из нас еще не знает. Так почему два вопроса? Kamil Maciorowski 6 лет назад 1
Два вопроса, потому что они для двух разных настроек. В одной настройке имена доступны в `finger` (и, возможно,` ls` может получить доступ к этой информации). В другом вопросе настоящие имена находятся в файле, но не в `finger`. root 6 лет назад 0
[Почему * не * разбирать `ls`?] (Http://unix.stackexchange.com/questions/128985/why-not-parse-ls) Вам не следует пытаться это делать:` ls -l | awk 'BEGIN } {$ 3 = map [$ 3]} 1'` Я предполагаю, что третий столбец вашей команды `ls -l` содержит пользователя. Cyrus 6 лет назад 1
Как упомянуто выше, не анализируйте вывод `ls` (это для людей, а не для машин) ... кроме того,` finger` на самом деле вообще не предназначен для этого ... предпочитайте что-то вроде `getent passwd $ { USER} `. Что еще хуже, я не думаю, что 4-е поле passwd стандартизировано ... см. [GECOS] (https://en.wikipedia.org/wiki/Gecos_field) Attie 6 лет назад 0

1 ответ на вопрос

0
Fanatique

Вы можете разобрать lsкак @Cyrus, упомянутый в комментариях. Тем не менее, я предлагаю простой скрипт для этого, который вы можете сделать как исполняемый файл:

while read -r line do user=`echo "$line" | awk ''` name=`getent passwd "$user" | cut -d ':' -f 5 | cut -d ',' -f 1` echo $line | sed "s/$user/$name/" done < <(ls -lh | tail -n +2) 

userПеременный получает имя владельца (с 3 - го столбца вывода LS), nameполучает настоящее имя этого имени пользователя, а затем на выходе lsмы просто заменить имя пользователя с реальным именем, используя sed.

Я не использовал fingerв своем примере, так как разбор /etc/passwdфайла менее подвержен ошибкам, и вам также не нужен внешний инструмент. ( fingerпо умолчанию не установлен в Debian / Ubuntu)

Пример вывода:

-rwxr-xr-x 1 Pavlin Nikolov fanatique 41 Aug 29 15:13 cpu.sh -rwxr-xr-x 1 Pavlin Nikolov fanatique 193 Aug 28 11:36 httpingwrap.sh -rwxr-xr-x 1 Pavlin Nikolov fanatique 3.8K Aug 14 15:36 imgconv.py -rwxr-xr-x 1 Pavlin Nikolov fanatique 504 Oct 19 16:04 lsp -rwxr-xr-x 1 Pavlin Nikolov fanatique 77 Aug 28 14:24 mg -rwxrwxrwx 1 Pavlin Nikolov fanatique 386 Sep 14 15:02 mon-install.sh -rwxr-xr-x 1 Pavlin Nikolov fanatique 589 Sep 11 11:55 ping-wrapper.py 

Обратите внимание, что это не самый лучший вывод, так как он не выровнен идеально, но все равно должен работать.

[Почему * не * разбирать `ls` (и что вместо этого делать?)] (Https://unix.stackexchange.com/questions/128985/why-not-parse-ls-and-what-do-to-instead ) ... `ls -lh | tail -n + 2` это только начало ... Вы должны _только_ использовать `--numeric-uid-gid`, если вы собираетесь попробовать :-) Attie 6 лет назад 0

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