ファイル名から角かっことその周辺を繰り返し削除します。

ファイル名から角かっことその周辺を繰り返し削除します。

[.*]ファイル名の先頭にある括弧とその内容()を再帰的に削除しようとしています。

たとえば、[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

おすすめ記事