Dizendo 'sim a todos' usando rm -i


10

Digamos que eu queria ter certeza de que estou removendo os arquivos corretos primeiro, então fiz algo como:

rm -i *

apenas para ter certeza de que estou bem com os arquivos que estou removendo. Então, isso me pedirá para cada arquivo. Após alguns arquivos, suponha que percebo que é exatamente o que eu queria remover. Em vez de CTRL+Cfazer e apenas fazer rm *, existe uma maneira de dizer Sim a todos ?

Essa questão vem mais da curiosidade do que da funcionalidade.


Pergunta estranha, mas enfim, sejamos criativos em nossas respostas!
dólmen

Respostas:


8

Não.

(A menos que você encontre uma maneira de inverter o bit 'interativo' com um depurador.)


[citação necessário] :-)
Daniel Beck

6
@ Daniel: coreutils/src/remove.c:335coreutils/lib/yesno.c:46(gerado) → rpmatch(3): "retorna 0 para uma resposta negativa reconhecida (" não "), 1 para uma resposta positiva reconhecida (" sim ") e -1 quando o valor da resposta não é reconhecido"
user1686

Very nice find!
Daniel Beck

3
Além disso, você pode colar um grande número de y [quebra de linha] no terminal, que não é "Sim para todos", mas a mesma coisa acontece.
Olli

haha verdade para a coisa 'y [linebreak]', eu gosto! :)
Amit 31/03

9

Bem, isso realmente não responde à sua pergunta. Mas, em vez de usar rm -i, considere aliasing rmpara rm -I:

A página do manual declara:

-I     prompt once before removing more than three files, or when removing 
       recursively. Less intrusive than -i, while still giving protection 
       against most mistakes

no seu ~/.bashrc, coloque:

 alias rm='rm -I'

isso é realmente útil!


4

Existe uma maneira de dizer Sim a todos?

A resposta é sim, usando este código:

$ yes "yes" | rm -vRI directory

  • v: mostra a lista de arquivos que foram removidos
  • R: remova diretórios e seu conteúdo recursivamente
  • I: conforme recomendação acima.

3

Basta verificar primeiro usando ls *.blae então rm -f *.blatalvez?

Tenha cuidado!


haha verdade esta é uma possibilidade
Amit

3

Se você estiver executando na tela (uma boa ideia em geral), poderá:

ctrl-a : exec .! yes y

Isso faria com que a tela execute o comando 'yes' com y sendo a saída e direcione a saída para o programa em execução (rm -i).


2

Isso pode ser feito substituindo os descritores de arquivo do aplicativo em tempo real. Você precisará de um arquivo intermediário.

Você pode usar o gdb e um pipe nomeado como este (supondo que você esteja usando mais terminais, caso contrário você precisará usar a tela ou outra coisa):

  • crie um pipe nomeado com "mkfifo myYesYesPipe"
  • inicie a cópia interativa com rm -i e encontre seu PID
  • gdb aberto

Em seguida, digite os seguintes comandos em gdb, substituindo o PID

attach rmPID
call open("/path/to/myYesYesPipe",66,0666)
call dup2(3,0)
call close(3)
detach
quit

Isso substitui o teclado por um pipe nomeado para rm.

Agora você precisa preencher o pipe nomeado

  • execute sim> / path / to / myYesYesPipe

O rm irá ler o pipe e sobrescrever tudo.


@grawity. você me inspirou a usar o depurador.
David Costa

1
  1. Coloque o rmprocesso em segundo plano com Ctrl+Z.
  2. Lembre-se do último comando (o rm -i *comando)
  3. Remova o -i
  4. Enter para executar o comando
  5. fg %1
  6. Ctrl+C

3
5s/fg/kill/; 6d
user1686

3
Como isso é melhor do que o usuário mencionou explicitamente que não quer fazer?
Daniel Beck
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.