私のフォルダには、この名前の形式のファイルが複数あります。
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##*.}
ファイル名の最後のドットの後のファイル名のサフィックスになります。
Perlユーティリティの使用rename
:
$ 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
まず何が起こるかを確認できます。
また見なさい: