Perl rename zum Umbenennen von Dateien und Verzeichnissen verwenden

Perl rename zum Umbenennen von Dateien und Verzeichnissen verwenden

Ich verwende das Perl-Befehlszeilentool „rename“, um rekursiv durch ein Verzeichnis zu suchen und alle gefundenen Verzeichnisse sowie Dateien umzubenennen. Das Problem, auf das ich stoße, ist, dass der Befehl „rename“ ein Unterverzeichnis einer Datei umbenennt und dann versucht, das übergeordnete Verzeichnis derselben Datei umzubenennen. Dies schlägt fehl, da das Unterverzeichnis umbenannt wurde, was zu der Meldung „Keine solche Datei oder kein solches Verzeichnis“ führt.

Befehl:

rename -f 's/foo/bar/' **
rename -f 's/Foo/Bar/' **

Hier ist beispielsweise eine Originaldatei, in der ich 'foo' durch 'bar' ersetzen möchte.

Datei:

/test/foo/com/test/foo/FooMain.java

Versagen:

Can't rename /test/foo/com/test/foo/FooMain.java /test/bar/com/test/foo/FooMain.java: No such file or directory

Bevorzugte Datei:

/test/bar/com/test/bar/BarMain.java

Sie können der Fehlermeldung entnehmen, dass versucht wird, das übergeordnete Verzeichnis umzubenennen, das Unterverzeichnis jedoch bereits geändert wurde, was zu dem Fehler „Datei nicht gefunden“ führt. Gibt es Parameter für den Umbenennungsbefehl, die dies beheben, oder muss ich anders vorgehen?

Antwort1

Ich würde das anders angehen, nämlich mit einer Tiefensuche anstelle der Shell Globstar**

Beispielsweise ist bei Verwendung von GNU findFolgendes gegeben:

$ tree
.
└── dir
    ├── foo
    │   └── baz
    │       └── MainFoo.c
    └── Foo
        ├── baz
        └── MainFoo.c

5 directories, 2 files

Dann

find . -depth -iname '*foo*' -execdir rename -- 's/Foo/Bar/;s/foo/bar/' {} +

führt zu

$ tree
.
└── dir
    ├── bar
    │   └── baz
    │       └── MainBar.c
    └── Bar
        ├── baz
        └── MainBar.c

5 directories, 2 files

Antwort2

Wie bereits erwähnt, fragen Sie nach Perl und zeigen den Code in sh.

Wenn Sie Perl 5 verwenden möchten

  • Das Modul File::Find::Rulehilft Ihnen beim Auffinden von Verzeichnissen.
  • Perl renameerledigt den Rest der Arbeit.

verwandte Informationen