たとえば、私のシステムで特定の名前で始まるすべてのファイルの所有者を見つけようとします。
[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
デバッグレポートを有効にすることもできます。)