Usando find com 2 conjuntos de variáveis

2

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?

    
por Sean 26.01.2015 / 22:38

3 respostas

3

Use um loop while-read para processar as linhas do arquivo

while IFS=: read userid filename
do
    find . -user "$userid" -name "$filename"
done < "$uidscript"
    
por 26.01.2015 / 23:11
2

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).

    
por 26.01.2015 / 22:57
2

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: .
  • Uso inútil de cat: faça: 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"))
    
  • O mesmo para os nomes de arquivos.

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
    
por 26.01.2015 / 23:35