フォルダ内にこの形式の名前のファイルが複数あります
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
参照: