Use um loop while-read
para processar as linhas do arquivo
while IFS=: read userid filename
do
find . -user "$userid" -name "$filename"
done < "$uidscript"
Eu quero poder executar um comando find no meu script bash que encontrará arquivos baseados em duas variáveis separadas. Eu cheguei até aqui, mas não tenho certeza de como obter o resultado final trabalhando find . -user $userid -name $filename
cat $uidscript
10017:title
10001:options.php
10005:dump.php(235)
Então, por diante, a variável contém o nome de usuário e o arquivo de propriedade do nome de usuário. Acho que preciso separar o userid e o nome do arquivo em duas listas separadas.
userid=$(cat $uidscript|cut -c1 -d':')
filename=$(cat $uidscript|cut -c2 -d':')'
A partir daqui, não sei como organizar o comando find em um loop for. Eu acho que seria algo assim ...
for i in $userid, $filename;
do
find . -user $userid -name $filename;
done
Alguém poderia me dar um empurrão na direção certa?
Você poderia fazer:
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")
(remova o echo
se esse for o comando correto que você deseja executar).
Enquanto as outras opções estão bem, gostaria de corrigir alguns erros na sua abordagem:
userid=$(cat $uidscript|cut -c1 -d':')
:
-c
recebe caracteres, você precisa de campos . Use cut -f1 -d:
. cut -f1 -d: <"$uidscript"
. Armazene o resultado em uma matriz para que você possa interagir nele e em outra matriz com facilidade:
IFS=$'\n' # split on newline
set -f # disable the glob part of the split+glob operator
userid=($(cut -f1 -d: <"$uidscript"))
Então você pode fazer um loop pelos índices de qualquer matriz:
for i in "${!userid[@]}"
do
find . -user "${userid[i]}" -name "${filename[i]}";
done