私は、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が行います。