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
残りのタスクを実行します。