Perl `rename`スクリプトはどのような場合には機能しませんか?

Perl `rename`スクリプトはどのような場合には機能しませんか?

次のコマンドを実行してみました。

find . -type f -exec rename -v 's/ /_/g' {} \;

、名前にスペースとアンダースコアを含むすべてのファイルの名前を繰り返し変更します。問題は、動作する場合もあり、動作しない場合もあることです。機能しないと、次のエラーが発生します。

Can't rename ./dir/subdir/file name with spaces ./dir/subdir/file_name_with_spaces: No such file or directory

私が何か間違っているのではないでしょうか?

ベストアンサー1

rename何が起こるのかは、次のファイルで実行しようとすることです。目次名前にスペースがあります。デフォルトでは、このrenameユーティリティは与えられたPerlコードビットを完全な引数、つまりパス名のファイル名部分だけでなくフルパス名に適用するので、やや単純です。

幸いなことに、パス名のファイル名部分に操作を制限するのは簡単です。

find . -type f -execdir rename -v 'tr/ /_/' -- {} \;

この-execdir述部は非標準ですが、通常は実装されています。-execdir代わりにinを使用すると、ファイルが-exec見つかったディレクトリを現在のディレクトリとして使用してコマンドが実行されます。これにより、renameユーティリティはファイルの親ディレクトリ名を表示できなくなります。

--ここでは、名前がダッシュで始まるファイルの名前を変更しようとするイベントを防ぐためにこれを使用しています(参照"--"(二重ダッシュ) とはどういう意味ですか?)。ファイル名の前にプレフィックスが付いているため、これはGNUでは問題になりませんがfind、少なくとも./BSDシステムの一部の実装ではこれは発生しません。find

rename別のオプションは、ユーティリティの-d--filenameまたはオプション(同じ)を--nopath使用することです。--nofullpath

find . -type f -exec rename -d -v 'tr/ /_/' {} +

これにより、ユーティリティは、指定されたパス名引数のファイル名部分以外の部分を考慮に入れることができません。

s///私はPerl式をコマンドからコマンドに自由に変更できましたtr///。なぜなら、私たちが行う変換は一般的な置換ではなく、単純な音訳であるからです。

renameスペースを含むファイル名にのみ実行したい場合があります。これは2017年1月以前-name '* *'-execテストで選択されました-execdir

おすすめ記事