複数のファイル名から特定の文字の後の文字列を削除するにはどうすればよいですか?

複数のファイル名から特定の文字の後の文字列を削除するにはどうすればよいですか?

フォルダ内にこの形式の名前のファイルが複数あります

01. file one-sdvanv-12lknl.srt
01. file one-sdvanv-12lknl.mp4
02. file two-afdsmakl-asdfafdaf.srt
02. file two-afdsmakl-asdfafdaf.mp4
03. file three-adfadaasd-asdfadfafad-adad1d1das.srt
03. file three-adfadaasd-asdfadfafad-adad1d1das.mp4

文字列を削除すると-ファイル名は次のようになります

01. file one.srt
01. file one.mp4
02. file two.srt
02. file two.mp4
03. file three.srt
03. file three.mp4

答え1

for file in *; do
    ext=.${file##*.}                #Gets file extension
    [ "$ext" = ".$file" ] && ext="" #If file had no extension, set it to empty string
    nostr=${file%%-*}               #Remove everything after -
    mv "$file" "$nostr$ext"
done

答え2

次のように bash パラメータ置換を使用できます。

for i in *; do
  # ${i%%-*} get everything before the first '-' (use ${i%-*} for the last '-')
  # ${i/.*} remove everything after the '.'
  # ${i##${i%.*}} remove everything except everything after the last '.'
  mv "${i}" "${i%%-*}${i##${i%.*}}"
done

答え3

ループの使用bash:

for name in *.mp4 *.srt; do
    mv -i -- "$name" "${name/-*./.}"
done

これは、変数置換によって、最初のダッシュと最後のドットの間のファイル名の部分をドットに置き換えることで、各.mp4ファイルとファイル名の名前を変更します。.srt

質問に示されているのは.mp4およびファイルであるため、これらを具体的に選択することにしました。.srt

ポータブルshループの使用:

for name in *.mp4 *.srt; do
    mv -i -- "$name" "${name%%-*}.${name##*.}"
done

ここで、 は${name%%-*}最初のダッシュの後のすべてが切り取られた元の名前になり、 は${name##*.}ファイル名の最後のドットの後のファイル名サフィックスになります。


Perlrenameユーティリティの使用:

$ tree
.
|-- 01. file one-sdvanv-12lknl.mp4
|-- 01. file one-sdvanv-12lknl.srt
|-- 02. file two-afdsmakl-asdfafdaf.mp4
|-- 02. file two-afdsmakl-asdfafdaf.srt
|-- 03. file three-adfadaasd-asdfadfafad-adad1d1das.mp4
`-- 03. file three-adfadaasd-asdfadfafad-adad1d1das.srt

0 directory, 6 files
$ rename 's/-.*\././' -- *.mp4 *.srt
$ tree
.
|-- 01. file one.mp4
|-- 01. file one.srt
|-- 02. file two.mp4
|-- 02. file two.srt
|-- 03. file three.mp4
`-- 03. file three.srt

0 directory, 6 files

Perl 式はs/-.*\././、指定された各ファイル名に適用され、ファイルの名前を変更する置換です。

この置換により、ファイル名の最初のダッシュから最後のドットまでの部分がドットに置き換えられます。

まず何が起こるかを確認するために、ユーティリティ-nの呼び出しに追加することをお勧めします。rename

参照:

関連情報