ディレクトリまたはファイルの所有者を検索しますが、それだけを返します。


62

ディレクトリの所有者とそれだけを返すコマンドを探しています- ls -latコマンドを解析する正規表現など?結果を別のスクリプトで使用したい。

回答:


102

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}'

2
簡潔さがボーナスである場合、stat -c%U / path。
tsvallender

1
それはGNU統計を前提としていますが、古いLinuxシステムではそうではありません(新しいシステムでも警戒しますが、ユーザーの家のどこかに別のstat(サイト全体の標準)があるかもしれません/usr/local/bin)、めったに利用できません他の大学で。
ジル 'SO-悪であるのをやめる'

1
stat -c %Uまた、での作業の利点があるBusyBoxの場合は、statコマンドがでコンパイルされています。
ジルは「悪であることを停止SO-」

1
ニース、最後の例(ls)はUnix / OSXとLinuxの両方で動作します
-kenorb

1
所有者に一致するローカルユーザーがいない場合(つまり、ネットワーク共有上にある場合)lsはuidを出力しますが、表示方法によってはあまり役に立たないか、より適切なstat -c '%U' DIR印刷UNKNOWNになります。
基本

18

の出力を解析する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よう、残念ながらこのアプローチにはいくつかの注意事項があります。私は最近のコメントで言及した「ターゲットファイル/ディレクトリは別の名前のシンボリックリンクです」という問題の解決策をまだ考えていません。
beporter 14

代わりにfind . -user "$username" -print -prune -o -pruneあなたができるfind . -maxdepth 0 -user "$username"
ニクラス・ホルム

@Gilles awk 'NR==1 {print $3}'ちょうどの代わりに使用する理由はありますawk '{print $3}'か?NR==1ここでなぜ必要なのかわかりません。
ハロルドフィッシャー

1
@HaroldFischerパスに改行が含まれるエッジの場合のみ。必要になることはめったにありませんが、決して有害ではありません。
ジル「悪さSO-ストップ」

@Gilles知っててよかった!! ちょうど好奇心が強い、あなたlsはパスの改行がラインを2つに分割する場所の実装を知っていますか?GNU ls(新バージョン)、BusyBox lsおよびFreeBSDではls、改行はそれぞれ$'\n'?およびとして返されます?
ハロルドフィッシャー

9

GNU findを使用してこれを行うこともできます。

find $directoryname -maxdepth 0 -printf '%u\n'

これは、GNUシステムの外部には移植できませんが、機能しないLinuxディストリビューションを見つけて驚いたでしょう。


1
これは、すべての非組み込みLinuxシステムおよび他のいくつかのシステム(Cygwinなど)で機能します。組込みシステムは持っている可能性がありますBusyboxのその、find持っていません-printf
ジル 'SO-悪であるのをやめる'

先ほど言ったように、GNUシステム。
mattdm

GNU coreutilsのないシステム(FreeBSDなど)には、-printf:
。– pevik

@pevikええ、まだ言ったように。ただし、必要に応じてGNU findをインストールできます。:)
mattdm

@mattdm:常にではありません:-(。最も重要なのは、移植性のあるスクリプトを書くときです。
pevik

2

純粋なbashでは、の出力をls配列に変換し、その配列にインデックスを付けることができます。

# (lrwxr-xr-x, 1, myuser, staff, 36, Oct, 21, 16:36, /path/to/file)    
file_meta=($(ls -ld /path/to/file))
file_owner="${file_meta[2]}" # myuser

これは、使用してのようにエレガントではありませんstatfindまたはawk、しかし、ピンチで働くことができました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.