我希望能够在 bash 脚本中运行 find 命令,该命令将根据两个单独的变量查找文件。我已经走到这一步了,但我不知道如何获得最终结果
find . -user $userid -name $filename
这是我要使用的参数文件:
cat $uidscript
10017:title
10001:options.php
10005:dump.php(235)
依此类推,变量包含用户名和用户名拥有的文件。
我想我需要将用户 ID 和文件名分成两个单独的列表。
userid=$(cat $uidscript|cut -c1 -d':')
filename=$(cat $uidscript|cut -c2 -d':')`
从这里我不确定如何将 find 命令组织成for
循环。我想事情会是这样的..
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"))
- 文件名相同。
然后您可以循环任一数组的索引:
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
如果这是您要运行的正确命令,请删除)。