Bashスクリプトからファイル所有者を返す方法を探しています。 「gawk」を使えば可能だと思いますが、正直なところ糸口もなく、オンラインで投稿された理解できる答えもないようです。
答え1
これに使用されますstat
。
GNUシステムでは:
所有者のユーザー名を取得するには:
stat -c '%U' file.txt
所有者のユーザーID(UID)を取得するには:
stat -c '%u' file.txt
ファイルがfile.txt
。
FreeBSDとMac OS Xで利用可能(@casありがとうございます):
ユーザー名:
stat -f '%Su' file.txt
UIDの場合:
stat -f '%u' file.txt
答え2
ls -l foo
フィールド#3は所有者、フィールド#4はグループです。したがって:
set -- $(ls -l foo) ; echo $3
しかし、統計資料できればもっといいと思います。
答え3
zsh
シェルにはモジュールに独自の組み込みコマンドがあることに注意してくださいstat
(そしてGNUとBSDが独自のコマンドを追加する前にそのコマンドがありました)zsh/stat
。
zmodload zsh/stat
stat +uid file
シンボリックリンクの確認済み所有者uidを出力しますfile
。シンボリックリンクの場合、最終的にファイルではなくシンボリックリンクの所有者を確認するには、この-L
オプションを追加します(stat
alstat()
ではなくa stat()
)。
-s
ユーザー名に翻訳するオプションを追加しますuid
。そのuidに複数のユーザー名があると報告されますgetpwuid()
。 uid にユーザー名がない場合、uid は翻訳されていません。
GNU coreutilsstat
コマンドが追加される前に、GNUは述語を介してこれを実行find
できました。-printf
find file -prune -printf '%U\n'
uidを一致するユーザー名に変換することで%U
置き換えられました。シンボリックリンクに沿って最終ターゲットの所有者を取得するオプションが%u
追加されました。-H
POSIXlyでは、次に頼る必要がありますls
。
LC_ALL=C ls -nd file | LC_ALL=C awk '{print $3; exit}'
-n
uidをユーザー名に変換することで置き換えます-l
(ユーザー名にスペースやタブが含まれていないと仮定)。-L
シンボリックリンクをたどるオプションを追加します。