Como usar 'yes' com 'xargs -p'?

3

Digamos que eu tenha ls | xargs -n1 -p rm , como eu uso yes ou yes n para responder automaticamente às perguntas geradas pelo -p flag?

Eu tentei yes n | (ls | xargs -n1 -p rm) , mas não funcionou.

P.S. Tentei adicionar a tag yes , mas não tive representação suficiente.

UPDATE : a questão não é realmente sobre rm , é sobre como usar yes corretamente. Eu tenho um alias ou uma função que usa xargs -p e eu gosto do fato de que ele me pergunta e me mostra o que está fazendo antes de fazê-lo. Quando eu souber o que ele fará, gostaria de poder usar yes para percorrer automaticamente todo o xargs -p na função. Então, mesmo que o exemplo use rm , não é realmente sobre isso.

Além disso, apenas para ser mais claro, não quero modificar meu alias ou função para usar ou não usar -p . Eu prefiro apenas inserir sim externamente.

Tbh pensei que algo como yes | some_function_asking_me_questions ou some_function_asking_me_questions <( yes ) teria funcionado, mas não funcionou.

2nd EDIT : outro exemplo: eu tenho um alias para listar os tópicos do AWS SNS em uma região como:

alias delete_snstopics="list_sns | cut -f 2 | xargs -n1 -p aws sns delete-topic --topic-arn "

Depois, tenho uma função que, para cada região da AWS, encontra e solicita a exclusão desses tópicos do SNS. Eu quero ver o aws sns delete-topic --topic-arn $1 que o xargs seria executado, porque o id do tópico SNS é diferente a cada vez e se algo der errado, eu posso corresponder o id do SNS no console da web. Além disso, às vezes, posso não querer excluir o tópico do SNS em uma região específica. E é por isso que eu quero usar yes com essa função, para que eu possa usar a mesma função para exclusão parcial e exclusão completa e ainda obter saída útil. Faz sentido?

    
por Gabriel 24.08.2015 / 21:09

2 respostas

1

Você pode usar:

ls | xargs -n1 rm -r

E isso funcionará para diretórios e / ou arquivos.

    
por 25.08.2015 / 06:45
1

Vamos analisar seu comando:

yes n | (ls | xargs -n1 -p rm)

O pipeline ls | xargs -n1 -p rm tem ls lendo a entrada padrão, mas tendo a saída padrão redirecionada para xargs , que toma como entrada padrão e tem sua saída padrão inalterada.

Agora você canaliza a saída de yes para esse pipeline. Como a entrada padrão desse pipeline entra em ls , o que nem sequer a lê, xargs não consegue ver nada disso.

Agora a pergunta óbvia é: Como xargs pode perguntar se você quer executar o comando? Afinal, sua entrada padrão (onde os programas normalmente liam a interação do usuário) é redirecionada para ler a saída de ls !

Bem, a resposta é que xargs ignora o mecanismo de redirecionamento para essas perguntas apenas abrindo o arquivo de terminal /dev/tty diretamente. Portanto, a entrada de confirmação não é afetada pelo redirecionamento de arquivos.

Para inserir em xargs , você precisa de um programa que possa apresentar o processo com um dispositivo terminal controlado pelo programa. Um programa muito poderoso (mas também bastante complicado) é expect . Infelizmente eu não conheço uma maneira mais simples de conseguir o que você quer.

    
por 28.08.2015 / 01:17

Tags