
Hier ist ein absoluter Anfänger, der versucht, Code zu schreiben, um das erste Leerzeichen aus einer Reihe von Dateinamen zu entfernen.
Wenn ich im Terminal eingebe:
#!/bin/bash
for f in *.jpg; do echo mv "$f" “${f/ /}”; done
Ich bekomme:
mv R 1 Pe.jpg “R1 Pe.jpg”
mv R 10 Ma.jpg “R10 Ma.jpg”
mv R 11 An.jpg “R11 An.jpg”
Aber wenn ich Echo entferne, findet die eigentliche Umbenennung nicht statt und ich erhalte diesen Fehler:
for f in *.jpg; do mv "$f" “${f/ /}”; done
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
Irgendwelche Vorschläge?
Antwort1
Das sind keine Zitate. Sie haben “
nicht "
:
$ uniprops “
U+201C ‹“› \N{LEFT DOUBLE QUOTATION MARK}
\pP \p{Pi}
All Any Assigned Punct Is_Punctuation Common Zyyy Pi P General_Punctuation
InPunctuation Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase
Initial_Punctuation Pat_Syn Pattern_Syntax PatSyn Print X_POSIX_Print
Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct
$ uniprops '"'
U+0022 ‹"› \N{QUOTATION MARK}
\pP \p{Po}
All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
X_POSIX_Print Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct
Da die Anführungszeichen in den Zielnamen keine richtigen doppelten Anführungszeichen sind, würde das zweite Argument an Leerzeichen getrennt und der erste mv
Befehl würde versuchen, die beiden Dateien in ein nicht vorhandenes Verzeichnis zu verschieben R 1 Pe.jpg
. “R1
Dies Pe.jpg”
verursacht die Fehler.
Versuchen Sie Folgendes:
for f in *.jpg; do echo mv "$f" "${f/ /}"; done
Antwort2
Ja, es ist ein Zitierproblem (siehe andere Antworten).
Für dieses spezielle Problem ist es jedoch besser, den rename
Befehl zu verwenden. (Der von Larry Wall)
z.B
rename -n -e "s/ //" *.jpg
Nach dem Testen und Überprüfen der Ausgabe. Entfernen Sie die -n
.
Installieren
Unter Debian mit apt install rename
.
Antwort3
Ja, die Anführungszeichen sind ein Problem. Das Echo zeigt den Befehl wie folgt an:
mv R 1 Pe.jpg “R1 Pe.jpg”
Wenn Sie dies in die Befehlszeile eingeben würden, würde es fehlschlagen, da die Leerzeichen in der Quelle weder in Anführungszeichen noch maskiert sind. Der richtige Befehl wäre:
mv "R 1 Pe.jpg" "R1 Pe.jpg"
Um die Variable $f in Anführungszeichen zu setzen, würde ich so etwas vorschlagen:
mv "\""$f"\"" "${f/ /}"
wobei "\"" der Escape-Code zum Drucken eines doppelten Anführungszeichens ist.
Nämlich: echo " n "
zeigt an n
. echo " \n " maskiert das n und zeigt eine neue Zeile an. Ebenso echo " \" "
maskiert ein Anführungszeichen innerhalb von Anführungszeichen.
Eine andere Option wäre:
mv '"'$f'"' "${f/ /}"