次のようなファイル名を持つファイルがたくさんあります。
myvideo.s01e01.episode.title.here.mp4
myvideo.s01e02.episode.title.here.mp4
一括して名前を変更したいので、次のようになります。
myvideo.s01e01.mp4
myvideo.s01e02.mp4
etc.
私はmacOSを使用していますが、ファイルがネットワーク共有にあるので、Linux経由でもアドレスを指定できます。
答え1
そしてzsh
:
autoload zmv
zmv -n '(*.s<->e<->).*(.mp4)' '$1$2'
満足したら削除してください-n
(テスト実行)。
答え2
アクセス権がある場合perl-rename
(rename
一部のLinuxディストリビューション、prename
他のディストリビューションperl-rename
などから呼び出されます)、次のことができます。
$ rename -n 's/(.+?\..+?\.).*\.(.*)/$1$2/s' *mp4
myvideo.s01e01.episode.title.here.mp4 -> myvideo.s01e01.mp4
myvideo.s01e02.episode.title.here.mp4 -> myvideo.s01e02.mp4
これは実際に名前を変更せずにコマンドが実行するジョブを印刷します。期待した結果が出力されたら、-n
実際にファイル名を変更せずにコマンドを実行してください。
ファイル名がなく、perl-rename
ファイル名に改行文字が含まれておらず、すべてのバイトがユーザーロケールの有効な文字で構成されている場合は、シェルから直接これを行うこともできます(これはzsh
-likeシェルとBSD互換のsed
実装を想定しています)。
for f in *mp4; do
newName=$(sed -E 's/(([^.]*\.){2}).*\.([^.]*)$/\1\3/' <<<"$f");
echo mv -- "$f" "$newName";
done
正しく表示されたらecho
。