findコマンドに-groupまたは-userワイルドカード文字を使用します。

findコマンドに-groupまたは-userワイルドカード文字を使用します。

たとえば、私のシステムで特定の名前で始まるすべてのファイルの所有者を見つけようとします。

[unu@here findtest]$ find . -ls
17295583    0 drwxrwxr-x   2 unu      unu            74 Mar 28 03:14 .
17295584    0 -rw-rw-r--   1 br_asd1  br_asd1         0 Mar 28 03:13 ./test1
17295585    0 -rw-rw-r--   1 br_asd2  br_asd2         0 Mar 28 03:13 ./test2
17295586    0 -rw-rw-r--   1 unu      unu             0 Mar 28 03:13 ./test33
17295587    0 -rw-rw-r--   1 br_bfg1  br_bfg1         0 Mar 28 03:14 ./test11
17295588    0 -rw-rw-r--   1 unu      unu             0 Mar 28 03:14 ./test22

名前が「br_」で始まるユーザーが所有するファイルのみを検索する必要があります。

だから私が試したことは

[unu@here findtest]$ find . -user "br_*" -ls
find: ‘br_*’ is not the name of a known user

今私が見つけた方法はawkを使用することでしたが、このアプローチには特定の問題があり、私が試している作業には実際には役に立ちません。

[unu@here findtest]$ find . -ls|awk '{if ($5 ~ "br_"||$6 ~ "br_") print $0}'
17295584    0 -rw-rw-r--   1 br_asd1  br_asd1         0 Mar 28 03:13 ./test1
17295585    0 -rw-rw-r--   1 br_asd2  br_asd2         0 Mar 28 03:13 ./test2
17295587    0 -rw-rw-r--   1 br_bfg1  br_bfg1         0 Mar 28 03:14 ./test11

-user検索やオプションにワイルドカードを追加する方法はありますか-group

答え1

作成する場合は、bash配列を使用して一連のユーザーを保持し、別の配列を使用してfindそのユーザーと一致する対応する文法を生成できます。

#!/bin/bash

# The beginning of the userids we need to match
match=br

# Find the matching set of users
users=($(
    getent passwd |
    awk -F: -vm="$match" 'BEGIN { re = "^" m } $1 ~ re {print $1}'
))

# Build the list of users ("find ( -user XX -o -user YY -o user ZZ ) ...")
finds=()
for user in "${users[@]}"
do
    finds+=('-o' '-user' "$user")
done
[[ ${#finds[@]} -gt 0 ]] && finds=('(' "${finds[@]:1}" ')')

# Execute the find command with the set of users
find . "${finds[@]}" -ls

いつものように、findコマンドの前にこのようなものを付けて、echo何が実行されるのかを確認できます。 (または、次のコマンドを実行してラインごとのbash -xデバッグレポートを有効にすることもできます。)

答え2

必要なものがリストだけなら、私は良い古いgrepオーバーの出力を使いますfind。速度は遅くなりますが、タイピングの数ははるかに減ります。

最も基本的なケースでは、次のように試すことができます。

find -printf '%u %p\n' | egrep '^br_'

これにより、ユーザーが所有するファイルのリストが表示され、各行br_*にはユーザー名とファイル名が表示されます。

その後、フォーマット文字列を調整して出力を拡張できます-printf 。

たとえば、出力に似ているようにするには、次のようにしますls

find -printf '%-8.8u %-8.8g %M %8s %t %p\n' | egrep '^br_'

コマンドラインをできるだけ短く保つ上で重要なのは、egreps部分を短く保つためにユーザー名を先頭に配置することです。

書式文字列に指定できるすべての項目を表示するには、次のページに進みます。ここを押して検索します-printf format

ただし、ファイル名に改行文字が含まれている場合、このソリューションではそれを表示するのに問題がある可能性があります。

関連情報