Você pode usar:
ls | xargs -n1 rm -r
E isso funcionará para diretórios e / ou arquivos.
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?
Você pode usar:
ls | xargs -n1 rm -r
E isso funcionará para diretórios e / ou arquivos.
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.
Tags xargs