コンピュータ上のすべてのユーザーのディレクトリを一覧表示したいと思います。一般的に私はそうします:
ls -l /home
しかし、私は他の人のコンピュータ、つまりmyHomeのように家と呼ばれていないコンピュータに配布されるスクリプトでそれを使用しています。
だから私はそれをls -l ~
。
どのように要約できますか?
ベストアンサー1
多くのシステムには、getent
ファイルの内容をリストまたは照会するコマンドがあります。ネームサービスpasswd
, group
, services
, protocols
... などのデータベース
getent passwd | cut -d: -f6
データベース内のすべてのユーザーのホームディレクトリを一覧表示します(6番目のコロンで区切られたフィールド)。列挙された。
ユーザー名自体は最初のフィールドにあるため、ユーザー名のリストは次のとおりです。
getent passwd | cut -d: -f1
(これは、これらのユーザーがシステムにログインしたり、ホームディレクトリが作成されたことを意味するのではなく、システムに知られ、ユーザーIDに変換できることを意味します。)
列挙できないデータベースの場合は、各ユーザーIDを個別に照会してみることができます。
getent passwd {0..65535} | cut -d: -f1,6
(これはuidが65535(一部のシステムはより多くをサポートしています)で停止し、シェルはzshの中{x..y}
括弧拡張形式をサポートしていると仮定します)。 LDAP、NIS+、SQL)ではこれを頻繁に実行したくありません。ディレクトリサーバー)でこれらすべてのクエリを実行します。
これはまた、同じuidを共有する複数のユーザーがいる場合、uidごとに1つのアイテムのみを取得するため、他のアイテムは無視することを意味します。
ない場合は、getent
次のことができますperl
。
perl -le 'while (@e = getpwent) {print $e[7]}'
(ユーザー名getent passwd
)$e[0]
または:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
getent passwd {0..65535}
同じ警告があります。
シェルでは~user
取得したホームディレクトリを使用できますが、ほとんどuser
のシェルでは制限された一連のユーザー名でのみ機能します(~
この拡散演算子がサポートするユーザー名に許可される文字のリストはシェルによって異なります)。一部のシェル(付属)では機能しません。機能しません(bash
ユーザー名が変数に保存されている場合は~$user
助けが必要です)。eval
そして、まだユーザー名のリストを取得する方法を見つける必要があります。
一部のシェルには、ユーザー名のリストを取得する機能が組み込まれています。
bash
:compgen -u
データベース内の列挙可能なユーザーのリストを返します。zsh
:$userdirs
ユーザー名をホームディレクトリにマップする連想配列(列挙可能なデータベースに制限されていますが、列挙~user
不可能なデータベースのユーザーに対して拡張するとエントリが追加されます$userdirs
)。だからあなたはこれを行うことができます:printf '%s => %s\n' "${(kv@)userdirs}"
ユーザーとそのホームディレクトリを一覧表示します。
tcsh
fish
そして、yash
ユーザー名を完成させる3つの異なるシェル(例:引数が完成したとき~<Tab>
)がありますが、プログラムでユーザー名のリストを取得できるようには見えません。