
[.*]
ファイル名の先頭にある括弧とその内容()を再帰的に削除しようとしています。
たとえば、[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
答え2
ここで何が起こっているのかを確認するには、次の操作を使用する必要があります-print
(そしてrename
そのフラグを使用して何も変更しようとする試みを一時的に停止する必要があります-n
)。
find . -type f -print -exec rename -n 's/^\[.*\]//g' {} \;
コマンドで実行されたファイル名を表示します。すべてで終わるため、パターンに一致するものはありません./
。
代わりに、行の[ … ]
最後の項目の直後に一致する必要があります/
。この単純なバージョンでは、/[ … ]
ディレクトリコンポーネントに一致するエントリがないと仮定します。
find . -type f -exec rename -n 's!(.*/)\[.*?]!$1!s' {} +
このより複雑なバージョンはこの可能性を正しく処理します(そしてより簡単なシナリオも完全に対応します)。
find . -type f -exec rename -n 's!(.*/)\[[^/]*?]([^/]*)$!$1$2!s' {} +
希土類分解:
s!x!y!s
- REを一致させ、x
テキストに置き換えますy
。末尾を使用すると、一致s
が複数行にまたがる可能性があります。(.*/)
-/
これを最初の対진表一致と呼んでください。$1
\[
- テキストマッチ[
.*?]
- 以下を含め、できるだけ少なく一致させます。]
([^/]*)
- そうでない場合は、できるだけ一致させてください/
。このゲームを呼び出す$2
$
- マッチ"行末」$1$2
- グループと一致するすべてを交換して$1
ください。$2
どちらの場合も、目的の操作が行われていると確信している場合にのみ-n
後ろに変更してください。-v
答え3
誰もが気持ちがいいならFDそしてnr、コマンドは次のとおりです。
fd -t f -x rnr -f --no-dump '\[.*\]' ''
使用しないことは-f
を使用するのと同じです--dry-run
。--dry-run
デフォルトです。
--no-dump
ダンプファイルを使わずに持っている場合でも名前変更操作の取り消し。