mv
ist nicht das richtige Werkzeug.
Sie sollten den rename
Befehl verwenden:
rename 's/\./_/' *.*.txt
Die Zeichenfolge 's/\./_/'
bedeutet " ersetze das erste Vorkommen von a .
durch ein _
in der folgenden Dateiliste".
Ich habe einige Dateien mit Namen wie (zu vielen, um dies jeden Tag manuell durchzuführen):
AA.B.txt WW.C.txt
und ich möchte sie umbenennen AA_B.txt
und WW_C.txt
so, dass der vorhandene SQL-Code weiterhin wie erwartet funktioniert. Im Moment werden diese Dateien aufgrund des Dateinamens Dateiname.letter.txt ignoriert.
ls
arbeitet und zeigt mir diese Dateien:
$ ls -a *.*.txt AA.B.txt* ABR.A.txt* ABR.B.txt* ABR.C.txt* ACT.A.txt*
Ein ähnlicher mv
Befehl schlägt jedoch fehl:
$ mv *.*.txt *_*.txt usage: mv [-f | -i | -n] [-v] source target mv [-f | -i | -n] [-v] source ... directory
Wie stimme ich meinem Muster zu, was ich will?
mv
ist nicht das richtige Werkzeug.
Sie sollten den rename
Befehl verwenden:
rename 's/\./_/' *.*.txt
Die Zeichenfolge 's/\./_/'
bedeutet " ersetze das erste Vorkommen von a .
durch ein _
in der folgenden Dateiliste".
Der Befehl mv kann nur ein Ziel, entweder das Umbenennen einer Datei (zB mv AA.B.txt AA_B.txt) oder eine Reihe von Dateien und Verzeichnisse in einem Verzeichnis zu bewegen (zB mv . .Txt newdir ). Wenn Sie eine Datei umbenennen möchten, müssen Sie dies nacheinander tun. Also eine Art Schleife.
Versuchen Sie etwas wie das Folgende:
for f in *.*.txt; do mv $ $(echo $ | sed -e 's#\.#_#') done
Der Befehl sed ersetzt nur den ersten gefundenen Punkt durch einen Unterstrich. Verbleibende Punkte bleiben unberührt.
Hoffe das hilft.