回答:
stat
GNU 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
: