Dire «oui à tous» en utilisant rm -i


10

Disons que je voulais m'assurer de supprimer d'abord les bons fichiers, j'ai donc fait quelque chose comme:

rm -i *

juste pour m'assurer que je suis d'accord avec les fichiers que je supprime. Cela me demandera donc pour chaque fichier. Après quelques fichiers, supposons que je réalise que c'est exactement ce que je voulais supprimer. Au lieu de CTRL+CING et juste faire rm *, est - il un moyen que je peux simplement dire oui à tous ?

Cette question vient plus de la curiosité que de la fonctionnalité.


Étrange question, mais quoi qu'il en soit, soyons créatifs dans nos réponses!
dolmen

Réponses:


8

Non.

(À moins que vous ne trouviez un moyen de retourner le bit «interactif» avec un débogueur.)


[citation nécessaire] :-)
Daniel Beck

6
@Daniel: coreutils/src/remove.c:335coreutils/lib/yesno.c:46(généré) → rpmatch(3): "renvoie 0 pour une réponse négative reconnue (" non "), 1 pour une réponse positive reconnue (" oui "), et -1 lorsque la valeur de la réponse n'est pas reconnue"
user1686

Très belle trouvaille!
Daniel Beck

3
En outre, vous pouvez simplement coller un grand nombre de y [saut de ligne] sur le terminal, ce qui n'est pas "Oui à tous", mais la même chose se produit.
Olli

haha vrai pour la chose «y [saut de ligne]», j'aime ça! :)
Amit

9

Eh bien, cela ne répond pas vraiment à votre question. Mais au lieu d'utiliser rm -i, envisagez de créer un alias rmpour rm -I:

La page de manuel indique:

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

dans votre ~/.bashrc, mettez:

 alias rm='rm -I'

c'est vraiment utile!


4

Existe-t-il un moyen de dire oui à tous?

La réponse est oui, en utilisant ce code:

$ yes "yes" | rm -vRI directory

  • v: afficher la liste des fichiers qui ont été supprimés
  • R: supprimer les répertoires et leur contenu récursivement
  • I: selon la recommandation ci-dessus.

3

Vérifiez d'abord en utilisant ls *.blapuis rm -f *.blapeut-être?

Faites attention!


haha vrai c'est une possibilité
Amit

3

Si vous utilisez l'écran (une bonne idée en général), vous pouvez faire:

ctrl-a : exec .! yes y

Cela entraînerait l'écran pour exécuter la commande «oui» avec y étant la sortie, et diriger ladite sortie vers le programme en cours d'exécution (rm -i).


2

Cela peut être fait en remplaçant les descripteurs de fichiers d'application à la volée. Vous aurez cependant besoin d'un fichier intermédiaire.

Vous pouvez utiliser gdb et un canal nommé comme celui-ci (en supposant que vous utilisez plus de terminaux, sinon vous devez utiliser screen ou autre chose):

  • créer un canal nommé avec "mkfifo myYesYesPipe"
  • démarrer la copie interactive avec rm -i et trouver son PID
  • ouvrir gdb

Tapez ensuite les commandes suivantes dans gdb, en remplaçant le PID

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

Cela remplace le clavier par un canal nommé pour rm.

Maintenant, vous devez remplir le tuyau nommé

  • exécutez yes> / path / to / myYesYesPipe

rm va lire le tube et tout écraser.


@grawity. tu m'as inspiré à utiliser le débogueur.
David Costa

1
  1. Mettez le rmprocessus en arrière-plan avec Ctrl+Z.
  2. Rappeler la dernière commande (la rm -i *commande)
  3. Retirer le -i
  4. Enter pour exécuter la commande
  5. fg %1
  6. Ctrl+C

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

3
En quoi est-ce mieux que ce que l'utilisateur a explicitement mentionné qu'il ne veut pas faire?
Daniel Beck
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.