区切り文字列を削除してファイル名を変更する

区切り文字列を削除してファイル名を変更する

ファイル名を含むフォルダとサブフォルダがたくさんあり、部分文字列のみを抑制する1. Introduction--- [ FreeCourseWeb.com ] ---.mp4ために、すべてのファイル(フォルダとサブフォルダ)の名前を再帰的に変更したいと思います。1. Introduction.mp4--- [ FreeCourseWeb.com ] ---

ベストアンサー1

名前の先頭に数字があり、部分---文字列が2回あり、.mp4名前の末尾にすぐに存在するすべてのファイルの名前を変更したいとします。また、2つの部分文字列---(サブ文字列自体を含む)間のビットを削除するとします。

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

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

未使用find(中bash):

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)が通常のファイルにのみ一致するようにしますが、およびはとを有効にするかのNようDに動作しますが、この特定のパターンに対してのみ機能します。nullglobdotglobbash

おすすめ記事