[.*]
ファイル名の先頭にある括弧とその内容()を再帰的に削除しようとしています。
たとえば、[Author1]BookName.epub
名前をに変更する必要がありますBookName.epub
。
ただし、角かっこが先頭にない場合(例BookName[Author1].epub
:)には何も変わりません。
このコマンドは有効ですfind . -type f -exec rename -v "s/\[.*\]//g" '{}' \;
ただし、^
角かっこがファイル名()の先頭にあることを確認するために追加するとfind . -type f -exec rename -v "s/^\[.*\]//g" '{}' \;
機能しません。 「動作しない」というのは、コマンドが正常に実行されるがファイル名が変更されないことです。エラーもなく、メッセージもありません。
ここで何が間違っている可能性がありますか?
ベストアンサー1
ファイル名を変更するときは、ファイル名(パスの最後のコンポーネント)のみを変更したことを確認してください。
Perlの名前変更の一部のバリエーションでは、-d
このオプションを使用して実行できます。
find . -depth -name '*\[*\]*' -type f -exec rename -v -d 's/^\[.*?\]//s' {} +
.*
注: 貪欲ではない so の代わりに ( と一致 ).*?
の変形と so フラグは、ここではテキスト行ではなくファイルパスを扱うため、改行とも一致します。./foo[x]bar/[a]b[c]d
./foo[x]bar/b[c]d
./foo[x]bar/d
\[.*\]
[a]b[c]
s
.
(したがって、ファイル-depth
名はファイルがあるディレクトリの前に変更されます。)通常のファイルの名前を変更するので、ここでは必ずしも必要ではありませんが、一般的に必要なので、ファイル名を変更するときにそれを含む習慣を持つことをお勧めします。
rename
このオプションがサポートされていない場合は、次のことが-d
できます。
find . -depth -name '*\[*\]*' -type f -exec rename '
s:(?<!/)\[[^/]*?\](?=[^/]*\z)::s' {} +
つまり、パスの最後まで()の[<characters-other-than-slash>]
後にaが続き、スラッシュ以外の文字だけが後に来ると削除されます。/
\z