次のコマンドを実行してみました。
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
。