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

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

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

注文する:

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

たとえば、これはrawファイルで、「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

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

答え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ディレクトリを見つけるのに役立ちます。
  • Perlはrename残りのタスクを実行します。

関連情報