web-dev-qa-db-ja.com

ディレクトリまたはファイルの所有者を見つけるが、それだけを返し、それ以外は何も返さない

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

67
Jason

statGNU coreutils からこれを行うことができます:

stat -c '%U' /path/of/file/or/directory

残念ながら、statにはいくつかのバージョンがあり、構文には多くの一貫性がありません。たとえば、FreeBSDでは、

stat -f '%Su' /path/of/file/or/directory

移植性が気になる場合は、おそらくlsawkを組み合わせて Gillesの提案 を使用する方が良いでしょう。 1つではなく2つのプロセスを開始する必要がありますが、POSIX標準機能のみを使用するという利点があります。

ls -ld /path/of/file/or/directory | awk '{print $3}'
107
cjm

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

GNU findでこれを行うこともできます:

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

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

10
mattdm

純粋な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を使用するほどエレガントではありませんが、ピンチで機能する可能性があります。

2
codehearts