コンピュータ上のすべてのユーザーのディレクトリを一覧表示したいと思います。一般的に私はそうします:
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>
)がありますが、プログラムでユーザー名のリストを取得できるようには見えません。
答え2
ユーザーのホームディレクトリをリストするより良い方法は、ユーザーのホームディレクトリが/etc/passwd
どこにあるかを想定するのではなく、解析して抽出することです。
2番目のコメントによれば、実際にはホームディレクトリではなくユーザー名が必要です。この場合、/etc/passwd
とにかくより良いオプションです。一部のLinux / UNIXシステムは他のユーザー認証メカニズム(LDAPなど)で構成されているため、クエリは最初に考えたものよりも複雑になりますが、これは/etc/passwd
良い出発点です。
答え3
短い答え:
compgen -u
通常の回答:を使用しているので、を使用してbash
可能なすべての完成項目を一覧表示できます。これは非常に一般的な使い方であり、省略することができます。シェルが組み込まれているので、独自のマニュアルページはありません。代わりに~
compgen -A user
compgen -u
compgen
大きな打撃(1)文書を受け取り、関連部分をお読みください。プログラム可能な完成。
より根本的な代替
移植性に深い関心を持っている場合は、他の人のbash
。
(getent passwd ||
dscl . -ls /Users dsAttrTypeNative:homeDirectory ||
nidump passwd ||
cat /etc/passwd) 2>/dev/null | cut -d: -f6
説明する
長い答えはすべてを試みたので、最新の/etc/nsswitch.conf(GNU / LinuxとBSDの両方が付属していますgetent
)、既存のUNIXパスワードフラットファイル、MacOSのディレクトリサービス1(dscl
)、そしてより古い猫のテーマバージョンのMacOS XとNeXTSTEP( nidump
) もあります。
シンプル
しかし、どのくらいの携帯性が好きですか? Unix ではタスクを実行する方法がさまざまで、時には単純なもので十分です。どちらかを選択する必要がある場合は、getent passwd | cut -d: -f6
シェルスクリプトを使用することをお勧めします。 ²
脚注1:私はもうMacOSを使用していません。したがって、誰かが私の構文が正しいこと(そして出力に混乱しているコロンが含まれていないか)を確認するのに役立ちますcut
。ありがとうございます。
脚注²:私が提案するものと私がすることは異なるかもしれません。個人的には、私はcut -d: -f1 /etc/passwd
コマンドラインで伝統的な方法をより頻繁に使用します。何十年も繰り返した結果、私の脳が別の仕事をしている間、私の指はタイピングをすることができました。
答え4
何についてls -l ~/..
?ホームディレクトリの親ディレクトリにあるすべてのディレクトリを一覧表示します。