mv-Dateien mit mehreren "." im Dateinamen

370
Jason

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.txtund WW_C.txtso, 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 mvBefehl 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?

1
Hinweis: In `mv *. *. Txt * _ *. Txt` verhält sich der` *. *. Txt'-Part wie in `echo *. *. Txt`; Der `* _ *. txt'-Part verhält sich wie in` echo * _ *. txt`. Es gibt keine logische Verbindung zwischen dem ersten Stern und dem dritten, noch zwischen dem zweiten und dem vierten. Kamil Maciorowski vor 5 Jahren 0

2 Antworten auf die Frage

2
Mr Shunz

mv ist nicht das richtige Werkzeug.

Sie sollten den renameBefehl verwenden:

rename 's/\./_/' *.*.txt 

Die Zeichenfolge 's/\./_/'bedeutet " ersetze das erste Vorkommen von a .durch ein _in der folgenden Dateiliste".

Oh. Ich wusste nichts über den Umbenennungsbefehl. Sehr schön. Lewis M vor 5 Jahren 0
Beeindruckend. Installierte "umbenennen" und das hat perfekt funktioniert. Nun zu lesen "Mann umbenennen". Ich danke dir sehr. Jason vor 5 Jahren 0
2
Lewis M

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.