2つの変数セットでfindを使用する

2つの変数セットでfindを使用する

2つの別々の変数に基づいてファイルを見つけるbashスクリプトでfindコマンドを実行できるようにしたいです。ここまで来ましたが、最終結果をどのように得るのかわかりません。

find . -user $userid -name $filename

私が使用したいパラメータファイルは次のとおりです。

cat $uidscript  
10017:title  
10001:options.php  
10005:dump.php(235)  

変数には、ユーザー名とそのユーザー名が所有するファイルが含まれます。

ユーザーIDとファイル名を2つの別々のリストに分割する必要があるようです。

userid=$(cat $uidscript|cut -c1 -d':')
filename=$(cat $uidscript|cut -c2 -d':')`

forここでは、findコマンドをループに設定する方法がわかりません。このように流れるようですが…

for i in $userid, $filename;
do 
    find . -user $userid -name $filename; 
done

誰かが私を正しい方向に押してもらえますか?

答え1

ループを使用したwhile-readファイル行の処理

while IFS=: read userid filename
do
    find . -user "$userid" -name "$filename"
done < "$uidscript"

答え2

他のオプションも問題ありませんが、アプローチのいくつかの間違いを修正したいと思います。

userid=$(cat $uidscript|cut -c1 -d':'):

  • -c必要なキャラクターを手に入れようフィールド。使用cut -f1 -d:
  • catの役に立たない使用: ちょうどしなさい: cut -f1 -d: <"$uidscript"
  • 結果とは異なる配列を簡単に繰り返すために、結果を配列に保存します。

    IFS=$'\n'  # split on newline
    set -f     # disable the glob part of the split+glob operator
    userid=($(cut -f1 -d: <"$uidscript"))
    
  • ファイル名は同じです。

その後、2つの配列のインデックスを繰り返すことができます。

for i in "${!userid[@]}"
do 
    find . -user "${userid[i]}" -name "${filename[i]}"; 
done

答え3

次のことができます。

IFS=:   # split on :
set -f  # disable glob part of the split+glob operator
echo find . $(
  awk -F: '
    {
      printf "%s", sep "(:-user:" $1 ":-name:" $2 ":):"
      sep = "-o:"
    }' < "$uidfile")

echo実行したい正しいコマンドの場合は削除してください)。

関連情報