Olá estou aprendendo script aqui. Estou tentando escrever um script simples usando o loop 'for'.
Eu tenho centenas de pastas em uma pasta chamada user.
se eu executar este comando, recebo uma lista de pastas que preciso mover para outra pasta
cat failed | awk -F ":" '/FAILED/ {print $1}' | uniq
ou seja, pastas em usuários que falharam em uma tarefa devem ser movidas para usuários/com falha/usuários com falha
o que estou fazendo atualmente é criar um novo arquivo primeiro usando
cat failed | awk -F ":" '/FAILED/ {print $1}' | uniq > failedusers
e então eu movo as pastas usando o seguinte comando
while read line; do cp -r users/$line users/failed; done < failedusers
Minha pergunta aqui é: posso fazer o mesmo usando apenas o comando for em vez de gravar a saída em outro arquivo e usar o comando while read para fazê-lo?
por exemplo, de alguma forma, atribua um valor a uma variável em um loop como
faileduser=`cat failed | awk -F ":" '/FAILED/ {print $1}' | uniq`
e depois escreva algo como
mv users/$faileduser user/failed/$faileduser
estou recebendo todos os tipos de erros quando estou tentando escrever algo como acima.
obrigado
Com GNU
xargs
e um shell com suporte para substituição de processo no estilo ksh, você pode fazer:Com
zsh
, você poderia fazer:Supondo que você queira copiar
USER
parauser/failed/USER
, ou seja, copiá-lo parauser/failed
, você também pode fazer (ainda comzsh
):Com o
bash
shell, você pode fazer algo semelhante com:Ou comece
awk
a anexar ouser/
para todos os nomes de usuário:Com um
for
loop, com shells do tipo Korn (incluindobash
, e também funcionaria comzsh
) a sintaxe seria:Que em
zsh
poderia ser encurtado para:Com:
(
`...`
sendo a forma arcaica e obsoleta de substituição de comando. Use$(...)
em vez disso).Você está armazenando
awk
a saída de uma variável escalar , não de array.Em
zsh
, você pode dividi-lo em nova linha com of
sinalizador de expansão do parâmetro, como fazemos diretamente acima na substituição do comando:No bash (ou ksh), você pode usar o operador split+glob depois de desabilitar o glob e o split ajustado:
(sim, em
bash
, deixar uma expansão de parâmetro sem aspas invoca um operador split+glob implícito (!), um recurso incorreto herdado do Bourne shell, corrigido no zsh e na maioria dos shells não Bourne modernos).