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é.

Amit
la source
É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.)

user1686
la source
[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!

Sébastien
la source
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.
Teocci
la source
3

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

Faites attention!

Jonathan Ross
la source
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).

Slartibartfast
la source
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.

David Costa
la source
@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
dolmen
la source
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