alternative Optionen zu rm -f

10

Ich möchte eine Befehlszeile ausführen:

cd ~/www/tmp/; rm -P 2*

Ich erhalte jedoch eine Fehlermeldung, wenn keine Dateien mit 2 beginnen.

Sie würden denken, ich würde jedoch verwenden wollen -f:

-f      Attempt to remove the files without prompting for confirmation, regardless of the file's permissions.  If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error.

Und ich kümmere mich um Dateiberechtigungen - wenn etwas Seltsames vor sich geht, würde ich den Befehl abbrechen vorziehen. Ich möchte nur Fehler unterdrücken, die nicht existieren.

Ich habe mir einige andere Fragen mit 'rm-Fehlern' angesehen und diese beiden gefunden, die (irgendwie) relevant erscheinen:

Löschen Sie Dateien und Verzeichnisse anhand ihrer Namen. Datei oder Verzeichnis existiert nicht

Aber ich verstehe nicht alles, was in den Antworten auf diese Frage vor sich geht, und weiß nicht, dass ich es brauche?

Der touchin dieser Frage vorgeschlagene Hack:

Haben Sie nicht gemeldet, wenn eine Datei fehlt?

Scheint praktikabel zu sein, da ich nicht denke, dass mir der Leistungstreffer etwas ausmacht (aber welche Art von Leistungstreffer würden Sie nehmen? - dh: Ist dies eine einigermaßen skalierbare Technik oder lerne ich nur sehr schlechte Gewohnheiten?)

Ich bin mir nicht sicher, wie ich eine if-theninnerhalb der Kommandozeile machen würde.

Gibt es andere Optionen für eine einfache Bereinigung durch Ausschneiden und Einfügen in der Befehlszeile?

Würde find -deletefür meinen Fall besser funktionieren? Wenn ja warum?


Fehler in Frage:

rm: 2*: No such file or directory
user3082
quelle
1
Der Fehler kommt von Ihrer Shell, nicht rm, also müssen Sie sagen, was das ist.
Michael Homer
Verwenden Sie zshals interaktive Shell? Erhalten Sie einen No matches foundFehler?
Kusalananda
2
@ MichaelHomer Nein, der Fehler ist von rm. Die Shell hat die Zeichenfolge lediglich an 2*rm übergeben, anstatt sie auf eine Liste von Dateien zu erweitern. Schauen Sie sich den fraglichen Fehler an: Es heißt, dass sich rm beschwert, nicht sh / bas / zsh / ...
doneal24

Antworten:

13

So ruft nur rm -Pfür bestehende reguläre Datei , deren Namen ein Muster in einem Verzeichnis (aber nicht unten):

find directory -maxdepth 1 -type f -name 'pattern' -exec rm -P {} +

Z.B,

find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +

Verwenden Sie ! -type danstelle von nur Nicht-Verzeichnisse anstelle von -type f. Der Unterschied besteht darin, ! -type ddass dies für eine größere Auswahl von Dateitypen gilt (symbolische Links, Named Pipes, Sockets usw.).

Da Sie für einige Bedingungen für die Dateien gefunden aufgefordert werden möchten, sollten Sie nicht verwenden , -deleteanstatt -exec rmwie da das funktioniert rm -f.

Entfernen -maxdepth 1, um findrekursiv in Unterverzeichnissen suchen zu lassen .

Kusalananda
quelle
3
Obwohl ! -type dkönnte näher sein rm 2*, denke ich?
Muru
Also müsste ich -P hinzufügen, um diese Funktionalität zu erhalten?:find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +
user3082
@ user3082 Ja, ich habe vergessen, dass du auch verwenden wolltest -P.
Kusalananda
Danke @muru, ich möchte eigentlich -type f, wusste aber nicht, wie ich mich so verhalten soll rm- also war @ Kusalanadas Vorschlag genau richtig und die Differenzierung / Erklärung ist großartig zum Lernen.
user3082
@ user3082 Sie müssten wahrscheinlich das erweiterte Globbing Ihrer Shell verwenden (z. B. rm 2*(.)in zsh).
Muru