Entfernen Sie Zeilenumbrüche in Dateinamen

9

Ich habe einen PHP-Code, der den Dateinamen generiert, an den wget seine Protokolle anfügt. Ich habe mehr als 2000 Dateien generiert, aber das Problem ist, dass ich Probleme habe, mit ihnen zu arbeiten, weil ich einen Fehler beim Einfügen PHP_EOLals Teil des Namens hatte. Dieser Code wird LF/line feed/%0Aunter seinem Namen hinzugefügt

Beispiel für einen solchen Dateinamen (beim Zugriff über den Browser, wenn er auf / var / www / html gesetzt ist) http://xxxx/wget_01_a%0a.txtBeachten Sie den %0aNamen vor der Erweiterung

Ich habe es vermasselt, und ich wünschte, es gibt einen Umbenennungsstapel, der alle Dateien durchsucht, und wenn er gefunden line feedwürde, würde er ihn ohne Zeilenvorschub umbenennen, so dass es einfach so wärehttp://xxxx/wget_01_a.txt

Ich bin mir nicht ganz sicher, wie ich damit umgehen soll, denn wenn ich lsauf Kitt alle Sonderzeichen mache, die nicht auf dieses unerwünschte Zeichen beschränkt sind, ?möchte ich nur auf diesen Zeilenvorschub abzielen.

Arvil
quelle

Antworten:

11

Verwenden des renamevon CentOS 6 bereitgestellten Dienstprogramms von util-linux unter der Annahme von bash:

rename $'\n' '' wget_*

Dadurch werden Sie aufgefordert, Zeilenumbrüche aus den Namen der aufgelisteten Dateien zu löschen. Ich empfehle, es an einer kleinen Teilmenge auszuprobieren, um sicherzustellen, dass es das tut, was Sie wollen (beachten Sie, dass renameCentOS 7 einen -vSchalter unterstützt , der Ihnen zeigt, welche Änderungen es vornimmt).

Wenn Sie stattdessen auf einer Distribution waren, die Perl-basiert bietet rename:

rename -n 's/\n//g' wget_*

Und dann ohne -nausführen, um die Umbenennung tatsächlich durchzuführen.

dhag
quelle
bro, nichts ist passiert pastebin.com/NjMg8vTL Ich benutze Centos 6
Arvil
Vielleicht ist der Linefeed-Charakter, den Sie haben, nicht wirklich \n? Können Sie so etwas wie Echo machen, *.txt | od -cdamit wir sehen, welches nicht druckbare Zeichen tatsächlich vorhanden ist?
Dhag
scheint wie \n pastebin.com/wXCDCJjr
arvil
Ich bin mir nicht sicher, was falsch ist, es sei denn, die Datei in Ihrer vorherigen Einfügung stimmt aus irgendeinem Grund nicht überein *.txt(was erklären würde, warum renamesie nicht aufgenommen wird). Wenn Sie die beiden Muster zu, sagen wir, txtstatt $'\n'und '', haben Sie keine Ausgabe erhalten? Druckt echo $ '\ n' tatsächlich zwei Zeilenumbrüche?
Dhag
1
Ich musste es verwenden, rename $'\r' '' wget_*damit es funktionierte
rshdev
2

Aufbauend auf dem, was bereits beantwortet wurde, habe ich es verallgemeinert, um alle Dateien mit Zeilenvorschub im aktuellen Ordner und Unterordner umzubenennen, indem ich den Befehl find mit dem Umbenennen kombiniere -

find -name $'*\n*' -exec rename  $'s|\n| |g' '{}' \;

Hier findet der Befehl find alle Dateien, die Zeilenvorschub enthalten, und der Befehl zum Umbenennen ersetzt jeden Zeilenvorschub im Namen durch ein Leerzeichen.

Das Gleiche kann für alle anderen problematischen Zeichen wie Wagenrücklauf (\ r) durchgeführt werden.

Prasad Bhat
quelle