区切られた部分文字列を削除してファイル名を変更する

区切られた部分文字列を削除してファイル名を変更する

という名前のファイルを含むフォルダーとサブフォルダーが多数あります。1. Introduction--- [ FreeCourseWeb.com ] ---.mp4すべてのファイル (フォルダーとサブフォルダー) の名前を再帰的に変更して、1. Introduction.mp4サブ文字列を抑制したいと考えています--- [ FreeCourseWeb.com ] ---

答え1

名前の先頭に数字があり、部分文字列が---2 回含まれ、その直後に名前の最後にあるすべてのファイルの名前を変更するとします。さらに、これらの部分文字列自体を含む.mp42 つの部分文字列間のビットを削除するとします。---

find . -type f -name '[[:digit:]]*---*---.mp4' -exec sh -c '
    for pathname do
        mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
    done' sh {} +

これは、現在のディレクトリ内またはその下にある、指定されたパターンに一致する名前を持つすべての通常ファイルを検索し、一致するサフィックス文字列を削除して---*---.mp4.mp4サフィックスを再度追加します。

使用しない場合findbash):

shopt -s globstar nullglob dotglob

for pathname in ./**/[[:digit:]]*---*---.mp4; do
    [[ ! -f $pathname ]] && continue
    mv -i "$pathname" "${pathname%---*---.mp4}.mp4"
done

これは基本的に コマンドと同じですfindが、シンボリック リンクの名前も変更します。 最初に設定される 3 つのシェル オプションは、**サブディレクトリまで再帰的に一致させるために使用されるグロビング パターンを有効にし ( globstar)、一致しないパターンを展開せずに削除し ( nullglob)、グロビング パターンが非表示の名前と一致するようにします ( dotglob)。

シェル内zsh:

for pathname in ./**/[[:digit:]]*---*---.mp4(.ND); do
    mv -i $pathname ${pathname%---*---.mp4}.mp4
done

ここで、 glob 修飾子のドットにより、(.ND)先行するパターンは通常のファイルのみに一致しますが、 とは のと を有効にするのND同じように動作しますが、この特定のパターンに対してのみ動作します。nullglobdotglobbash

答え2

renameパッケージのツールutil-linux( と呼ばれることもありますrename.ul) とを使用しますfind

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename -i -- '--- [ FreeCourseWeb.com ] ---' '' {} \;

オプションは-i、既存のファイルを上書きする許可を求めます。


Larry Wall の Perlrenameスクリプトとを使用しますfind

find . -type f -name '*--- \[ FreeCourseWeb.com \] ---.mp4'\
  -exec rename 's/--- \[ FreeCourseWeb.com \] ---//' {} \;

-f/オプションが使用されない限り、既存のファイルはデフォルトでは上書きされません--force。代わりにエラー メッセージが表示されます... already exists

関連情報