Ich laufe unter Debian Stable, Cinnamon DE und habe einige Dateien, die ich mit einer Befehlszeile löschen möchte (im Moment lösche ich diese Dateien mit Nemo).
Diese .txt
Dateien beginnen beispielsweise mit '?' in der Schale und in Nemo dieses '?' wird durch einen Wagenrücklauf ersetzt:
$@debian: ls
ssolveIncpUL46pK ?ssolveIncpUL46pK.txt
Ich habe es versucht:
rm ?ss*
rm \?ss*
rm \ ss*
debian
command-line
delete
nemo
Smilia
quelle
quelle
?
es sich nicht um ein nicht druckbares Zeichen,ls
das als dargestellt wird?
. Was ist die Ausgabe vonls | sed -n l
?rm "?FileName"
oderfind . -name "\?*" -exec rm {} \;
rm hat keinen Regex-Typrm
analysiert?
oder nicht*
, aber die Shell erweitert diese Globs vor der Ausführungrm
.ls -Q
würde in Debian besser funktionieren.Antworten:
Das Zeichen ist kein Fragezeichen. Das
ls
Dienstprogramm ersetzt nicht druckbare Zeichen durch?
. Es ist weiterhin unklar, ob das nicht druckbare Zeichen wirklich das erste Zeichen im Dateinamen ist oder ob davor ein oder mehrere Leerzeichen stehen können.Wenn Sie beide Dateien löschen möchten, können Sie den "fehlerhaften Teil" mit
*
abgleichen und dann den Rest des sichtbaren Dateinamens genauer angeben:Dies würde zuerst das gegebene Muster auf alle passenden Dateinamen erweitern und sie dann
rm
entfernen. Seien Sie genauer und geben Sie einen längeren Teil des Dateinamens an, wenn Sie Dateien löschen möchten, die nicht mit dem obigen kurzen Muster übereinstimmen, z. B. mitDies setzt voraus, dass Sie sich im selben Verzeichnis befinden wie die Dateien, die Sie löschen möchten.
Die
-i
Option,rm
eine Bestätigung anzufordern, bevor etwas gelöscht wird.quelle
*ssolve*
es zusammen, wenn?ss*
nicht??
stimmt nicht genug mit dem "schlechten Teil" des Dateinamens überein. Es kann etwas mit Multi-Byte-Zeichen zu tun haben? Oder es kann einfach sein, dass vor dem nicht druckbaren Zeichen ein Leerzeichen steht. Mit so etwas bist du besser als ich.ls | sed -n l
.echo ./*ssolve*
vor demrm
... nur für den Fall tun .Der geeignete Weg, um diese Art von Dateien zu entfernen, besteht darin, den
inode
Wert der Datei zu verwenden.Verwenden Sie den folgenden Befehl, um den
inode
Wert abzurufenDas erste Feld des Longlist-Ergebnisses ist der Inode-Wert.
Verwenden Sie dann den Befehl find, um die Datei wrt inode zu löschen.
quelle
find
Implementierung auf dem betreffenden System das nicht standardmäßige-inum
Prädikat unterstützt (was zfind
. B. GNU tut).ls -li
wird Ihnen sagen, ob die Datei irgendwelche festen Links hat. (Wenn die Nummer unmittelbar davorroot root
ist1
, gibt es keine festen Links).ls
nur 1 fester Link angezeigt wird. Dies liegt daran, dass zwei separate Dateien mit separaten Dateneinträgen tatsächlich dieselbe Inode-Nummer haben können, wenn sie sich auf verschiedenen gemounteten Dateisystemen befinden, denke ich. Sie sollten wahrscheinlich die Option-x
oder verwenden-xdev
, um dies zu vermeiden (obwohl Sie immer noch das Problem des vorherigen Kommentars haben.)n
auf mehreren verschiedenen gemounteten Dateisystemen für sehr unterschiedliche Dateien zugewiesen werden kann. Wenn Inode 1234 in einem Dateisystem vorhanden ist, wird nicht ausgeschlossen, dass derselbe Inode 1234 in einem anderen Dateisystem vorhanden ist.Es wird nicht empfohlen, a
*
zum Entfernen von Dateien zu verwenden. Es könnte mehr passen, als Sie möchten.In Debian kann der
ls
Befehl (von GNU) die Werte der Dateien in Anführungszeichen drucken [ 1 ] :Oder, noch besser, listen Sie Dateien mit zitierten Namen und Inodes auf:
Verwenden Sie dann rm mit der Inode-Nummer, um sicherzustellen, dass nur die richtigen Dateien entfernt werden:
Der Aufruf zum Suchen ist auf ein Dateisystem (
-xdev
) beschränkt, um zu vermeiden, dass eine Datei in einem anderen Dateisystem mit derselben Inode-Nummer abgeglichen wird. Beachten Sie auch, dassrm
dies mit der-i
Option (interaktiv) aufgerufen wird , sodass in der Befehlszeile gefragt wird, ob jede Datei gelöscht werden soll.[ 1 ] Beachten Sie, dass dies das Problem mit visuell verwirrenden Zeichen wie Kyrillisch
а
($ '\ U430') und Lateina
($ '\ U61'), die genau gleich aussehen, aber nicht gleich sind, nicht löst. Um die Bytes, die ein Dateiname verwendet, besser sehen zu können, müssen wir einen Hex-Viewer verwenden.quelle