Massenumbenennung von Dateien, Entfernen von Punkten

1

Ich möchte Dateien umbenennen, um nicht benötigte Punkte zu löschen. dh:

File.something.jpg -> Filesomething.jpg
I.Have.Too.Many.Dots.png -> IHaveTooManyDots.png

Wie geht das? find -name *.*.*listet sie alle auf, aber ich konnte keinen Ausdruck für sed schreiben, da er keine faulen regulären Ausdrücke unterstützt.

Robus
quelle

Antworten:

3

Probieren Sie es aus:

sed ':a;s/\.\([^.]\+\)\./\1./;ta' 

Du könntest es so benutzen:

find -name "*.*.*" | xargs -I % bash -c 'mv "%" "$(echo "%" | sed "s|^./||;:a;s/\.\([^.]\+\)\./\1./;ta")"'

Es wurde großzügig mit Anführungszeichen bestreut, sodass es mit Dateinamen funktionieren sollte, die Leerzeichen enthalten.

Dennis Williamson
quelle
Arbeitete, legte alle Dateien in meinem aktuellen Verzeichnis obwohl> :(. Trotzdem danke
Robus
@Robus: Hast du die Version mit benutzt basename? Das war ein Fehler. Das tut mir leid. Die überarbeitete Version sollte keine Dateien aus Unterverzeichnissen in das aktuelle Verzeichnis verschieben.
Dennis Williamson
2

Bash benutzen:

find . -name '*.*.*' -exec bash -c 'base=${0##*/}; base=${base%.*}; mv "$0" "${0%/*}/${base//./}.${0##*.}"' {} \;

Verwenden von zsh:

autoload zmv
zmv '(**/)(*).(*)' '$1${2//./}.$3'
Gilles
quelle