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
実行したい正しいコマンドの場合は削除してください)。