Использование find с двумя наборами переменных

Я хочу, чтобы иметь возможность запускать команду find в моем сценарии bash, который найдет файлы на основе двух отдельных переменных. Я получил это далеко, но я не уверен, как добиться конечного результата
find . -user $userid -name $filename

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

Таким образом, переменная содержит имя пользователя и файл, принадлежащий имени пользователя.
Я думаю, мне нужно разделить идентификатор пользователя и имя файла на два отдельных списка.

 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 

Может ли кто-нибудь дать мне толчок в правильном направлении?

Используйте цикл while-read для обработки строк файла

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

Вы можете сделать:

 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 если это правильная команда, которую вы хотите запустить).

В то время как другие варианты в порядке, я хотел бы исправить некоторые ошибки в вашем подходе:

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

  • -c получает символы, вам нужны поля . Используйте cut -f1 -d:
  • Бесполезное использование кошки: просто выполните: 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