将 find 与 2 组变量一起使用

将 find 与 2 组变量一起使用

我希望能够在 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如果这是您要运行的正确命令,请删除)。

相关内容