Wie kann ich alle Dateien in einem bestimmten Verzeichnis umbenennen, in dem die Dateien Leerzeichen und Sonderzeichen ($ und @) enthalten?
Ich habe den folgenden rename
Befehl versucht , um alle Leerzeichen und Sonderzeichen durch ein _ zu ersetzen:
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report Morning$AP@20150716.csv
$ rename -n 's/ |\$|@/_/g' *
$ ls -lrt
total 464
-rwxr-xr-x. 1 pmautoamtion pmautoamtion 471106 Jul 17 13:14 Bharti Blocked TRX Report Morning$AP@20150716.csv
$
Der Befehl funktioniert, nimmt jedoch keine Änderungen an den Dateinamen vor und gibt auch keinen Fehler zurück. Wie kann dies behoben werden und gibt es auch andere Möglichkeiten?
linux
shell-script
rename
Ankit Vashistha
quelle
quelle
Antworten:
Die
-n
Flagge ist fürEs ist also normal, wenn Sie keine Änderungen haben.
In Bezug auf Ihren Befehl funktioniert es für mich:
Abhängig von Ihrer Shell müssen Sie möglicherweise dem | entkommen
Oder Sie können die
[…]
Notation verwenden, um Zeichen zu gruppieren:quelle
rename -n 's/./_/g' *
gibt etwas aus?Sie könnten es so versuchen:
Wenn Sie mit dem Ergebnis zufrieden sind, entfernen Sie das
echo
Vorhermv
, um die Dateien tatsächlich umzubenennen.quelle
Auf der Suche nach einem ansehnlichen Skript zum Entfernen von Sonderzeichen sowie deutschen Sonderzeichen, das durch universelle Zeichen ersetzt wird, um nützliche Informationen nicht zu entfernen. Ich habe die letzte Version des Skripts aktualisiert, bei der einige kleinere Probleme aufgetreten sind:
ergebend:
@don_crissti: Er macht das Hokus-Pokus mit der Infile, da Linux seine eigenen Probleme mit der Behandlung von Sonderzeichen beim Verschieben des Dateinamens haben würde.
quelle
Da der
rename
Befehl aus unbekannten Gründen bei mir nicht funktioniert hat und ich keine anderen Antworten auf meine Frage bekomme, habe ich mich selbst bemüht, die Umbenennung zu ermöglichen. Dies ist möglicherweise nicht der beste Ansatz, um die Dateien umzubenennen, aber es hat bei mir funktioniert. Deshalb möchte ich es als Antwort veröffentlichen, damit jemand, der dies liest, Hilfe erhält, um die Dateinamen so zu ändern, wie ich es getan habe.Jetzt weiß ich, dass alle Dateien einen bestimmten Text in ihren Namen haben, nämlich das Wort "Block". Im Folgenden sind die Dateinamen aufgeführt, bevor sie umbenannt wurden:
Jetzt habe ich ein kleines Shell-Skript geschrieben, um dies zu ermöglichen. Es folgt der Code:
Und das war's, wenn ich das Skript ausführe, benennt es alle Dateinamen mit Leerzeichen (
) oder
$
oder@
mit_
anstelle dieser Zeichen um.quelle
cat foo | sed S1 | sed S2 | sed S3 >> bar
durchsed -e S1 -e S2 -e S3 foo >> bar
sed 's/[ ()@$]/_/g'
odersed 'y/ ()@$/_____/'
In diesem Fall werden nur die Sonderzeichen aus den Dateinamen entfernt
setzen Sie
echo
nach; do
, um vorher zu testen, wie:Eine andere Lösung:
-n
Option zum Testen vor.quelle
Ich habe schon seit einiger Zeit nach einer Lösung für dieses Problem gesucht. Ich arbeite an alten geschlossenen Systemen, auf denen keine neuen Pakete installiert werden können. Ich habe den
rename
Befehl nicht. Schließlich habe ich ein Skript geschrieben, das anscheinend mit allen über die Tastatur eingegebenen Sonderzeichen funktioniert.~@#$%^&*()-_=+[]{}\|;:",<.>?'
Das Skript benennt jede Datei und jedes Verzeichnis im aktuellen Verzeichnis um. Es werden alle Sonderzeichen außer-_.
durch das_
Zeichen ersetzt. Dieoutfile=
Zeile kann geändert werden, um bei Bedarf ein anderes Zeichen zum Ersetzen zu verwenden. Ersetzen Sie|_|
durch|.|
, um beispielsweise das.
Zeichen zu verwenden.quelle
Für mich unter Ubuntu 18.04 LTS mit Bash 4.4.20 (1) -Veröffentlichung hat dieser Einzeiler gut funktioniert, um Leerzeichen zu entfernen, @ ,: # ...
Zum Testen (beachten Sie den
echo
Befehl:Ausführen:
quelle