検索を使用して正規表現でファイル名を検索し、このファイルの名前を変更する方法

検索を使用して正規表現でファイル名を検索し、このファイルの名前を変更する方法

次に終わるすべてのファイルを見つけようとします。

  • 先祖-人類-オデッセイ-予告編-720-1262.mp4
  • ハイテクダイバー -1080-1234.mp4
  • Amazonダイバー -720-1323.mp4

次のようにファイル名を変更します。

  • 720-1262.mp4
  • 1080-1234.mp4
  • 720-1323.mp4

正規表現を使用しましたが、何も機能しませんでした。なぜですか?何が問題なの?

find . -regex '^.*-(([0-9])*-([0-9])*)\.mp4'

ディレクトリは1つだけで、これらのファイルにはサブディレクトリはありません。約300個の.mp4ファイル

答え1

GNUはfind複数の正規表現方言をサポートしています(この-regextypeオプションでは1つを選択できます)。かっこの一部は特殊文字であり、他の括弧では特別な意味を得るためにバックスラッシュをエスケープする必要があります。

~によるとオンライン文書、使用されるデフォルトの方言-regexは「POSIX basic」です。マニュアルページインターネットでは、基本方言は「Emacs」と呼ばれます1。両方の角括弧をグループ化文字として使用するには、角括弧をバックスラッシュでエスケープする必要があります。

以下はうまくいきます。

find . -regex '^.*-\(\([0-9]\)*-\([0-9]\)*\)\.mp4'
find . -regextype posix-extended -regex '^.*-(([0-9])*-([0-9])*)\.mp4'

しかし、^ここではこれは必要ではなく(-regexファイル名に対して正確な一致を実行する)ため、グループ化は必要ないようです。

find . -regex '.*-[0-9]*-[0-9]*\.mp4'

十分でなければなりません(データの並べ替えに関連する潜在的な問題を取り除きます。ロケールによっては、[0-9]より多くが一致する可能性があります)。[0123456789]

名前の変更について:Perlの実装rename(利用可能な場合)が便利な選択になります。名前を変更するすべてのファイルが現在の作業ディレクトリにあるとします(必須ではありませんfind)。

perl-rename -nv 's/.*-(\d*-\d*\.mp4)\Z/$1/' -- *

(これは、\Zトピック2$の終わりに一致する標準正規表現と同じです)。

nコマンドの機能が満足であれば、(テスト実行)オプションを削除します.

気づく

  • --.mp4名前は次のように変更されます-.mp4\d+最後の数字の前後に少なくとも1つの数字が表示されるように要求します。-
  • .*また、隠しファイルの名前を変更する必要があります。

または、GNUfindと標準mvユーティリティを使用して(また、サブディレクトリに再帰的に降順):

find . -regex '.*-[0-9]*-[0-9]*\.mp4' -execdir sh -c '
  for file; do
    toremove=${file%-*-*.mp4}
    echo mv -- "$file" "${file#"$toremove"-}"
  done' mysh {} +

echoコマンドの機能が満足であれば削除してください。


¹次のようにスティーブン・チャジェラスコメントで指摘したように、文書の不正確さ/不整合性に関して、savannah.orgにいくつかのバグレポートが提出されました。https://savannah.gnu.org/bugs/?58384https://savannah.gnu.org/bugs/?52592https://savannah.gnu.org/bugs/?61304
²Perlの$一致はトピックの終わりにありますが、トピックの終わりの改行の前にもあるため、区切り文字を含めるか含まない可能性があるテキスト行を処理するのは問題ありませんが、次の\Z処理を行うと正しく機能しません。ここにはファイル名などの他のものがあります。

答え2

そしてzsh

autoload zmv
zmv -n '(**/)*-(<->-<->.mp4)' '$1$2'

-n必要に応じてテストを実行するために削除)。

関連情報