rm -i
lit sa réponse à partir de l'entrée standard, dont il hérite de la while
boucle. Donc, une ligne de texte list.txt
est utilisée comme réponse à la question "vraiment supprimer?" question. Pour résoudre ce problème, vous devrez séparer les deux sources d'entrée. Le moyen le plus simple consiste à read
prendre son entrée à partir d'un descripteur de fichier distinct:
while IFS= read <&3 -r i; do
rm -i -- "$i" # Quote the file name, not just to be safe,
# but because it's the right syntax.
done 3< list.txt
Vous ne redirigez plus l'entrée standard (fd 0) pour la boucle while, vous rm
lirez donc à partir du terminal comme vous le souhaitez.
Alternativement, vous auriez pu faire:
IFS=$'\n' # set field separator to newline
set -f # disable globbing upon command substitution
rm -i -- $(cat list.txt)
Ou, avec GNU xargs:
xargs -rd '\n' --arg-file=list.txt rm -i --
y
, le fichier précédent aurait été supprimé?y
, mais tout nom commençant pary
. Apparemment, ilrm
suffit de regarder le premier caractère de la réponse qu'il reçoit: «y» est oui, tout le reste est non.Pour quelque chose d'un peu plus fantaisiste que de répondre oui ou non à chaque fichier, vous pouvez utiliser
iselect
pour une sélection interactive basée sur ncurses. par exempleou pour permettre la sélection de fichiers dans le répertoire courant:
Cela affichera une liste basée sur ncurses en plein écran (terminal complet), où les fichiers peuvent être sélectionnés et désélectionnés à volonté en appuyant sur ESPACE. appuyez sur ENTER pour accepter vos sélections (les entrées sélectionnées seront imprimées sur stdout), ou
q
pour quitter (rien imprimé sur stdout). appuyezh
pour obtenir de l'aide.Notez le
echo rm
- je l'ai écrit comme ça pour les tests. changez-le justerm
une fois que vous êtes sûr de comprendre ce qu'il fait.Notez également qu'il
xargs
est utilisé ici avec\n
comme séparateur d'entrée. Cela ne fonctionnera pas si l'un des noms de fichiers contient des caractères de saut de ligne. D'ailleurs, leiselect
ne fonctionnera pas correctement non plus - il attend un élément par ligne - malheureusement,iselect
n'a pas d'option pour une entrée ou une sortie à terminaison nulle.iselect
est empaqueté pour debian, probablement ubuntu et d'autres distributions aussi. la page d'accueil est à http://www.ossp.org/pkg/tool/iselect/la source