2016-07-25 8 views
-3

ich eine Reihe von Dateien wie dieseWie zwei Teile eines Dateinamens

name-id.ext 

und ich möchte Namen tauschen die ID und den Namen in der Datei tauschen, so dass sie benannt sind

id-name.ext 

Dies scheint zu funktionieren, das einzige Problem ist, dass es die Datei extention Swaps zu

for file in *; do echo "${file#*-}-${file%-*}"; done 
+0

I Ich habe versucht, alle möglichen Dinge zu finden, das ist was ich bisher herausgefunden habe und ich denke, sollte funktionieren, aber es nicht tun, für die Datei in *; echo "$ {Datei% - *} - $ {Datei # * -}"; done –

+2

Bitte bearbeiten Sie Ihre Antwort, um Ihren Code hinzuzufügen, anstatt einen Kommentar hinzuzufügen. Auf diese Weise können Sie es formatieren und es einfacher zu lesen. Sie zwingen auch nicht dazu, dass Leute versuchen, Ihnen zu helfen, sich durch eine Menge von Kommentaren zu graben und die Informationen aufzuheben. – Robert

+1

Ihre '$ {Datei% -}' usw. sieht ungefähr richtig aus. Hast du es für 1 Datei arbeiten lassen, bevor du gegen all deine Dateien läuftst? Haben Sie Ihre Dateien überprüft, um sicherzustellen, dass sie keine Leerzeichen oder Ctrl-Zeichen in ihren Namen enthalten und dass Sie vernünftigerweise erwarten können, dass Ihre Lösung für alle Dateien funktioniert? Zukünftig sollten Sie sicherstellen, dass Sie den Code, den Sie versucht haben, ** in den Text Ihres Q ** einbeziehen, damit die Leute nicht durch jede wachsende Kette von Kommentaren lesen müssen. Viel Glück! – shellter

Antwort

3

diese der Verwendung einer Kombination erreicht werden kann:

  • reguläre Ausdruck Gruppen, die beiden Teile des Dateinamen vertauscht werden, erkennen: '^(.*)-(.*)\.ext'

  • sed den ersten Teil mit dem zweiten Teil zu tauschen: sed 's/^\(.*\)-\(.*\)\.ext$/\2-\1\.ext/'

  • echo an Rohr der alte Dateiname in sed: echo $file | sed 's/^\(.*\)-\(.*\)\.ext$/\2-\1\.ext/'
  • speichern Sie es in einer Variablen: newname=$(echo $file | sed 's/^\(.*\)-\(.*\)\.ext$/\2-\1\.ext/')
  • mv können die Brocken aus dem vorherigen Punkt als neuen Namen verwenden: mv $file $newname

  • Das Ganze kann in einer Schleife gewickelt werden über die Dateien zu gehen:

    for file in *ext; do newname=$(echo $file | sed 's/^\(.*\)-\(.*\)\.ext$/\2-\1\.ext/'); mv $file $newname; done;

+0

betrachten sollte, das hat perfekt funktioniert! Vielen Dank! –