Dateien in Unterverzeichnisse umbenennen

Dateien in Unterverzeichnisse umbenennen

Ich versuche, eine Reihe von Dateien mit „Rename“ umzubenennen, und habe meinen regulären Ausdruck gut eingerichtet:

rename --verbose --path 's|^\[(....)\](.*)\.(.*)|$2 ($1).$3|' *

Ich hätte aber wirklich gern, dass jede Datei in einem Verzeichnis mit dem gemeinsamen Anfang abgelegt wird, also habe ich naiv Folgendes versucht:

rename --verbose --path 's|^\[(....)\](.*)\.(.*)|$2 ($1)/$2 ($1).$3|' *

Aber das beschwert, dass keines der Verzeichnisse existiert (da sie es nicht tun). Verpasse ich ein nützliches Flag zum Umbenennen oder gibt es dafür ein besseres Tool?

Antwort1

Wenn Sie ein Perl-basiertes verwenden rename, hindert Sie nichts daran, mkdir()zum Erstellen der fehlenden Verzeichnisse Folgendes aufzurufen:

rename --verbose '
    s|^\[(....)\](.*)\.(.*)|$2 ($1)/$2 ($1).$3| &&
    mkdir("$2 ($1)")' *

Dies ist derselbe Perl-Ausdruck, den Sie verwenden, mit einem zusätzlichen Aufruf am mkdir()Ende, um das Verzeichnis zu erstellen, wenn der Ausdruck übereinstimmt.

Ob die ursprüngliche Ersetzung richtig ist oder nicht oder ob sie Sinn ergibt, weiß ich nicht (ich weiß nicht, welche Arten von Dateinamen Sie haben). Der Punkt ist, dass Sie, da es sich bei dem Ausdruck um einen generischen Perl-Ausdruck handelt, jeden beliebigen Perl-Code verwenden können, solange $_(die Standardvariable) am Ende auf den resultierenden Dateinamen gesetzt ist.

verwandte Informationen