Idealerweise hätte ich gerne einen solchen Befehl
rm --only-if-symlink link-to-file
weil ich mich zu oft verbrannt habe, um versehentlich die Datei zu löschen, anstatt den Symlink, der auf die Datei verweist. Dies kann besonders schlimm sein, wenn sudo beteiligt ist. Jetzt mache ich natürlich eine ls -al
, um sicherzustellen, dass es sich wirklich um einen Symlink und dergleichen handelt, aber das ist anfällig für Bedienerfehler (ähnlich benannte Datei, Tippfehler usw.) und Rennbedingungen (wenn jemand wollte, dass ich aus irgendeinem Grund eine Datei lösche). Gibt es eine Möglichkeit zu überprüfen, ob eine Datei ein Symlink ist, und sie nur zu löschen, wenn sie sich in einem Befehl befindet?
bash
command-line
rm
Shelvacu
quelle
quelle
Antworten:
quelle
!
und ändern||
zu&&
||
Form zu bevorzugen .&&
bringt Dinge runter, wenn Sie imset -e
Modus sind.[ ! -L $1 ]
), unter Verwendung eines ungültigen Operators ([ ! -l foo ]
) oder sogar Syntaxfehler ([ ! -q foo || echo foo
)rm_if_link(){ [ -L "$1" ] && rm -v "$1"; }
ist, dass das Ausführen auf einem Nicht-Link-set -e
Modus Ihren Shell-Prozess beendet. Sie könnten anhängen,|| :
aber dann wird es meiner Meinung nach noch weniger klar als die! ||
Version, und es wird verhindert, dass einrm
Fehler Sie umbringtset -e
, was wahrscheinlich unerwünscht ist.! ||
ist ziemlich prägnant und klar und leidet unter keinem dieser Probleme.rm
Innere in Ihren Test ein, b) Verwenden Sie eine tatsächliche if-Anweisung, c) Verwenden Sie keine-e
interaktiven Shells (und testen Sie Ihre Skripte!). Wenn Sie über die Lesbarkeit streiten möchten,if
ist es ziemlich eindeutig der Gewinner , zu testen, ob etwas ein Link ist.Sie können mit
find
ihrer und-type l
Testbedingung (siehe dort Tests , wenn das Objekt gefunden ist eine l Tinte oder nicht)Wenn Sie beispielsweise eine Datei
foo
im aktuellen Verzeichnis haben, können Sie dies tun:Möglicherweise können Sie dies mit nur folgenden Funktionen vereinfachen:
Womit alle Symlinks im aktuellen Verzeichnis gelöscht würden.
Warnung:
Die
-delete
Option infind
ist wirklich sehr, sehr gefährlich. Stellen Sie sicher, dass Sie es am Ende des Suchbefehls platzieren. Wenn Sie es falsch platzieren, wird alles gelöscht, was es findet, unabhängig davon, ob die Ergebnisse Ihrer Bedingung entsprechen.Wie in den Kommentaren vorgeschlagen, besteht eine sicherere Option darin,
find
undrm -i
(was Sie zwingt, das Entfernen von Dateien zu bestätigen) in Verbindung zu verwenden:Persönlich
-exec trash {} \;
lösche ich Dateien vorübergehend, weil ich wie Sierm
in der Vergangenheit von gebrannt wurde . Double geht für eine falsch platzierte-delete
Flagge.http://slackermedia.ml/trashy
quelle
find . -type l -iname "foo" | xargs rm -i
Es ist sicherer.rm -i
Sicherheitsgründen.-print0
fürfind
und-0
für zu verwendenxargs
.@
ist ein Glob-Qualifier ; Das Musterfoo(@)
stimmt mit demfoo
überein, was übereinstimmt, aber nur mit den symbolischen Links.foo(-@)
würde nur mit defekten symbolischen Links übereinstimmen.foo(@,L0)
würde nur symbolischen Links und leeren Dateien entsprechen.Wenn Sie zsh ausführen, müssen Sie natürlich nur tippen
rm foo(@)
. Sie müssen darauf achten, Entervor dem Tippen nicht zu drücken(@)
.quelle