Ich versuche, alle Dateien mit einem Leerzeichen in ihren Namen zu löschen. Ich benutze folgenden Befehl. Aber es gibt mir einen Fehler
Befehl : ls | egrep '. ' | xargs rm
Wenn ich hier nur den ls | egrep '. '
Befehl verwende, erhalte ich den gesamten Dateinamen mit Leerzeichen in den Dateinamen. Wenn ich jedoch versuche, die Ausgabe an rm zu übergeben, werden alle Leerzeichen (führende oder nachfolgende) gelöscht. Mein Befehl wird also nicht richtig ausgeführt.
Gibt es Hinweise, wie die Datei gelöscht werden kann, deren Name mindestens ein Leerzeichen enthält?
echo
erste führen wollen, um sich vor Tippfehlern zu schützen. Fügen Sieecho
vorne hinzu, und es werden alle Dateien ausgedruckt, die entfernt werden sollen.find
man das Huhn manchmal nicht mit einem Maschinengewehr töten muss, obwohl es mächtig ist. UNIX-Administratoren würden im Allgemeinen nichtfind
auf (zum Beispiel) "alle Dateien entfernen, die mit dem Buchstaben A beginnen" zurückgreifen ... man würde einfachrm A*
. Ebenso kann rm die Arbeit erledigen, um Dateien zu entfernen, die Leerzeichen enthalten. Mit anderen Worten, lassen Sie sich nicht täuschen, denn der Raum ist unsichtbar und wird von der Shell speziell behandelt. Entkomme einfach, wie Stephen Kitt es getan hat, und du kannst es dir wie jeden anderen Charakter vorstellen.Ich würde das Parsen vermeiden
ls
Ausgabe zuWarum nicht :
Kein Problem mit
rm
:-).Dies ist zwar rekursiv und löscht alle Dateien mit Speicherplatz im aktuellen Verzeichnis und in verschachtelten Verzeichnissen, wie in den Kommentaren erwähnt.
quelle
-name '* *'
anstelle des regulären Ausdrucks verwenden; und (2) Sie können-print0 | xargs -0 rm -i
@ StephenKitts Anliegen ansprechen.xargs
. Verwenden Sie einfach-exec rm -i '{}' +
find . -maxdepth 1 -name '* *' -delete
.Schauen Sie sich diesen Angenommenen Namen "seltsame Datei" an
Lösung eins
Lösung zwei
Lösung drei
Sie sehen dann die Inode
Bei sehr seltsamen Dateinamen wie
verwenden
quelle
Von
man xargs
Wir können Ihren anfänglichen Befehl (meistens) korrigieren, indem wir das xargs-Trennzeichen in eine neue Zeile ändern:
ls | egrep '. ' | xargs -d '\n' rm
(Tu das nicht ... lies weiter)Was aber, wenn der Dateiname eine neue Zeile enthält?
touch "filename with blanks and newline"
ls
ist wirklich ein Werkzeug für den direkten Verbrauch durch einen Menschen , stattdessen müssen wir denfind
Befehl verwenden, der die Dateinamen durch ein Nullzeichen (-print0
) trennen kann . Wir müssen grep auch anweisen, Nullzeichen zu verwenden, um input (-z
) und output (-Z
) zu trennen . Schließlich weisen wir xargs an, auch Nullzeichen (-0
) zu verwenden.find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm
quelle
Sie können verwenden:
quelle
Um dies zu tun, benötigen Sie die
-Z
Option grep und die-0
Option xargs. Aber ich würde es nicht so machen (ls
ist nicht das richtige Werkzeug für den Job, es gibt viele Probleme, den Computer dazu zu bringen, seine Ausgabe zu lesen).Weitere Antworten finden Sie auf andere Weise.
Ebenfalls
ls | …
ist äquivalent zuls -d *
undecho * | …
Alle haben Probleme. Verwenden Sie daher nicht
ls
so, sondern eine Lösung aus einer anderen Antwort.quelle
ls *
wenn Pipes ausgegeben werden, werden die Dateinamen durch neue Zeilen getrennt.echo
(zumindest einigeecho
Implementierungen) erweitert Backslash-Sequenzen.grep -Z
dient zum Schreiben von Dateinamen, die bei Verwendung NUL-getrennt sind-l
, hilft hier nicht weiter. Wenn Sie das gemeint haben-z
, hilft das auch nicht, da die meistenls
Implementierungen keine Option zum Ausgeben von NUL-getrennten Dateinamen haben. Man könnte aber so etwas machenprintf '%s\0' * | grep -z ' ' | xargs -r0 rm -f
.