回答:
statGNU coreutils からこれを行うことができます:
stat -c '%U' /path/of/file/or/directory
残念ながら、には多数のバージョンがありstat、それらの構文にはあまり一貫性がありません。たとえば、FreeBSDでは、次のようになります
stat -f '%Su' /path/of/file/or/directory
移植性が懸念される場合は、おそらく使用して方がいいでしょうジルの提案組み合わせるlsと、をawk。1つではなく2つのプロセスを開始する必要がありますが、POSIX標準機能のみを使用する利点があります。
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat(サイト全体の標準)があるかもしれません/usr/local/bin)、めったに利用できません他の大学で。
stat -c '%U' DIR印刷UNKNOWNになります。
の出力を解析するlsことはめったに良い考えではありませんが、最初のいくつかのフィールドを取得することは例外です。実際には、すべての「従来の」ユニックスで動作します(ユーザー名にスペースを許可するWindows実装などのプラットフォームでは動作しません)。
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
別のオプションは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
ls | awkように、残念ながらこのアプローチにはいくつかの注意事項があります。私は最近のコメントで言及した「ターゲットファイル/ディレクトリは別の名前のシンボリックリンクです」という問題の解決策をまだ考えていません。
find . -user "$username" -print -prune -o -pruneあなたができるfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'ちょうどの代わりに使用する理由はありますawk '{print $3}'か?NR==1ここでなぜ必要なのかわかりません。
lsはパスの改行がラインを2つに分割する場所の実装を知っていますか?GNU ls(新バージョン)、BusyBox lsおよびFreeBSDではls、改行はそれぞれ$'\n'、?およびとして返されます?。
GNU findを使用してこれを行うこともできます。
find $directoryname -maxdepth 0 -printf '%u\n'
これは、GNUシステムの外部には移植できませんが、機能しないLinuxディストリビューションを見つけて驚いたでしょう。
find持っていません-printf。
-printf: