So vermeiden Sie, dass beim Entfernen einer geschützten Datei mehrmals ein "y" ausgegeben werden muss

52

Ich suche nach einer Lösung als Antwort auf "rm: schreibgeschützte reguläre Datei entfernen [x]?"

Ich habe darüber nachgedacht, in bashrc eine Figur zu veröffentlichen, der mehrere Male ein Wagenrücklauf folgt. Wie machen wir das?

Iancovici
quelle
Sie können eine Funktion definieren. Dieser Thrad kann Ihnen helfen: stackoverflow.com/questions/756756/… .
Alpert
Warum willst du das machen? Es ist auf jeden Fall eine sehr unklare Aufgabe, Zeilenumbrüche (im Gegensatz zu Zeilenumbrüchen) zu drucken, und zwar in .bashrc?
l0b0
@ l0b0 Frage bearbeitet, um genauer zu sein
Iancovici
Warum sollten Sie Dateien in .bashrc entfernen wollen? Die ursprüngliche Aufgabe ist noch nicht klar.
l0b0
3
@echadromani Bei SO / SE ist es sehr verbreitet, das ursprüngliche Problem zu verstehen, um eine optimale Lösung zu finden, die auf andere Situationen anwendbar sein kann.
l0b0

Antworten:

75

Bearbeiten basierend auf aktualisierter Frage:

Fügen Sie die -fOption ("force") hinzu, um zu vermeiden, dass Sie zum Entfernen von Dateien aufgefordert werden :

rm -f /path/to/file

Dies hat einen Nebeneffekt, den Sie beachten sollten: Wenn einer der angegebenen Pfade nicht vorhanden ist, wird dies nicht gemeldet und es wird erfolgreich zurückgegeben:

$ rm -f /nonexistent/path
$ echo $?
0

Ursprüngliche Antwort:

Hier ist eine einfache Lösung:

yes "$string" | head -n $number | tr $'\n' $'\r'

yesWiederholt jede Zeichenfolge, die Sie eingeben, unendlich, durch Zeilenumbrüche getrennt. headstoppt es nach einiger $numberZeit und trübersetzt die Zeilenumbrüche in Zeilenumbrüche. Möglicherweise wird aufgrund der Wagenrückläufe keine Ausgabe angezeigt, die Übergabe an diesen Befehl (in bash) sollte dies jedoch veranschaulichen:

printf %q "$(yes "$string" | head -n $number | tr $'\n' $'\r')"

Benutzer ohne bashDosenrohr das Ergebnis od, hexdumpoder xxddie tatsächlichen Zeichen zurückgegeben , um zu sehen.

l0b0
quelle
7

Das andere Problem, auf das ich von Zeit zu Zeit rmgestoßen bin, ist rm -idas folgende:

alias rm='rm -i'

In diesem Fall können Sie entweder unalias rmoder Sie können diesen Trick, den ich vor Jahren herausgefunden habe, verwenden, indem Sie einen Backslash vor einen Befehl setzen, der mit einem Alias ​​versehen wurde, um den Alias ​​nur einmal zu ignorieren. Beispiel:

\rm somefile

Sie können mehr über Aliase in einem Artikel bei Nixcraft erfahren .

slm
quelle
5

rmist fest codiert, um "interaktiv" (Eingabeaufforderung wartet auf Benutzereingabe) nach schreibgeschützten Dateien zu fragen. Es gibt zwei Methoden, um zu verhindern, dass rmgefragt wird:

rm -rf somedir

und

rm -r --interactive=never somedir

(beide funktionieren auch ohne -rbeim löschen von dateien statt dirs)

Erläuterung:

-fbewirkt rm, dass "nicht vorhandene Dateien und Argumente ignoriert werden, niemals aufgefordert wird".

--interactive=nevertut was es sagt: Sei niemals interaktiv. mit anderen worten: nie auffordern.

Der Unterschied zwischen -fund --interactive=neverist dieser Teil: "Ignoriere nicht vorhandene Dateien und Argumente".

vergleichen Sie:

$ rm -rf nonexistingname
$ echo $?
0

und

$ rm -r --interactive=never nonexistingname
rm: cannot remove 'nonexistingname': No such file or directory
$ echo $?
1

Der Unterschied ist vor allem dann interessant, wenn Sie Skripte schreiben, bei denen Sie nie rminteraktiv sein möchten, aber dennoch Fehler behandeln möchten.

Zusammenfassung: In der Befehlszeile verwenden rm -rf. in Skripten verwenden rm -r --interactive=never.


Eine Antwort auf die angegebene Frage ("Wie Sie vermeiden, dass beim Entfernen einer geschützten Datei mehrmals ein" y "ausgegeben werden muss") finden Sie unter https://askubuntu.com/questions/338857/automatically-enter-input-in-command-line / 338860 # 338860

Lesmana
quelle
1

gib einfach allen deinen Befehlen ein Ja!

yes | rm -r /path/
yes | <command>

Wie auch immer, Sie können immer zwingen, mit -f:

rm -r -f /path
Nakamoto
quelle
-2

Ich bin auch auf dasselbe Problem gestoßen. Die obige Antwort gilt nur für eine Datei, aber wenn Sie viele Ja ignorieren möchten.

Sie können verwenden

sudo rm -r /path/to/directory

um alle schreibgeschützten regulären Dateien zu entfernen

Gopal Prasad
quelle
Dies wird herabgestuft, da das gesamte Verzeichnis entfernt wird. Vermutlich möchte OP nur die betreffende Datei entfernen, nicht jede einzelne Datei im selben Verzeichnis-Teilbaum.
Jake
Hey ... vielleicht hast du recht.
Gopal Prasad
Hey ... vielleicht hast du recht. Aber nicht in diesem Fall .. Als ob ein Benutzer viel Geduld und Zeit hat, dann hat er auch Zeit, mehrmals 'Ja' zu geben ... Ich habe angenommen, dass er alle Dateien mit einem Befehl entfernen möchte .. Als schreiben Eine geschützte Datei muss immer bestätigt werden, bevor diese Art von Datei gelöscht wird. Ein Beispiel ist der Fall, wenn Sie virtualenv erstellen und später in Python entfernen möchten. Versuchen Sie es, und Sie werden jedes Mal aufgefordert, den Befehl rm zu bestätigen Sie müssen eine Antwort geben. Ich habe die Situation auf diese Weise gelöst.
Gopal Prasad