Perl rename を使用してファイルとディレクトリの名前を変更する

Perl rename を使用してファイルとディレクトリの名前を変更する

私は、Perl の rename コマンドライン ツールを使用して、ディレクトリを再帰的に検索し、見つかったディレクトリとファイルの名前を変更しています。私が遭遇している問題は、rename コマンドがファイルのサブディレクトリの名前を変更してから、同じファイルの親ディレクトリの名前を変更しようとすることです。サブディレクトリの名前が変更されているため、これは失敗し、「そのようなファイルまたはディレクトリはありません」というメッセージが表示されます。

指示:

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

たとえば、ここに「foo」を「bar」に置き換えたい元のファイルがあります。

ファイル:

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

失敗:

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

優先ファイル:

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

エラー メッセージから、親ディレクトリの名前を変更しようとしていることがわかりますが、その時点ではサブディレクトリはすでに変更されているため、ファイルが見つからないというエラーが発生します。名前変更コマンドにこれを修正するパラメーターはありますか、それとも別の方法で対処する必要がありますか?

答え1

私は別の方法でこれを実行します。具体的には、シェルglobstarの代わりに深さ優先探索を使用します。**

たとえば、GNU を使用するとfind、次のようになります。

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

5 directories, 2 files

それから

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

結果的に

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

5 directories, 2 files

答え2

前述のとおり、perl について質問しており、sh のコードを示しています。

Perl 5を使いたい場合

  • モジュールはFile::Find::Ruleディレクトリを見つけるのに役立ちます。
  • rename残りの作業はPerlが行います。

関連情報