Comando Shell para excluir usuários antigos da rede no Mac OS X Server

0

Estou tentando excluir contas antigas de usuários de rede do nosso servidor de laboratório (Mac OS X 10.6). Eu encontrei um comando de linha de comando simples para encontrar diretórios de usuários que não foram acessados por mais de um ano:

find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356

A execução deste comando lista com sucesso todas as contas antigas. Eu então encontrei o que parece ser um loop for simples, mas não funciona:

#!/bin/bash

keep1="/Volumes/Server-HD2/NetworkUsers/Students/studenttest"
keep2="/Volumes/Server-HD2/NetworkUsers/Students/studenttest2"

USERLIST='find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356'

for a in $USERLIST ; do
  [[ "$a" == "$keep1" ]] && continue                    #skip account 1
  [[ "$a" == "$keep2" ]] && continue                    #skip account 2
  echo "Deleting account and home directory for" $a
  dscl . delete $a                                      #delete the account
  rm -r $a                                              #delete the home directory
done

Quando executo este comando como um arquivo shell executável ou apenas diretamente na linha de comando, ele percorre $ a como sendo cada palavra no $ USERLIST. Em outras obras, se eu simplesmente fizer isso:

USERLIST='find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356'

for a in $USERLIST ; do 
   echo $a
done

Ele retornará:

find
/Volumes/Server-HD2/NetworkUsers/Students
-type
d
-maxdepth
1
-mindepth
1
...

considerando que eu esperaria que ele retornasse cada diretório que atenda ao comando "find".

Eu preciso descobrir como fazer uma matriz dos resultados do comando find para percorrer. Eu acho que eu simplesmente não entendo como os arrays e strings são manipulados no bash. Alguma idéia?

    
por James Pierce 03.11.2011 / 20:55

1 resposta

0

Você incluiu seu comando find na designação USERLIST entre aspas simples - que atribuirá o comando inteiro como uma string à variável $USERLIST (precedendo toda expansão de shell - isso é as citações simples são para). Em vez disso, para obter a saída do comando atribuída, é necessário incluí-la nos backticks (') ou em uma construção $(<command>) , ou seja,

USERLIST='find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356'

ou

USERLIST=$(find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356)
    
por 03.11.2011 / 21:10