Bagaimana cara membersihkan ekstensi file?

9

Saya memiliki direktori dengan file .MP3 yang ingin saya ubah ekstensi menjadi .mp3. Apa cara termudah untuk melakukan ini? Saya memikirkan sesuatu seperti:

find /RootPath -type f -iname "*.mp3" -exec mv {} sed s/.*MP3/\1.mp3/ \; 

... meskipun saya tahu itu tidak benar. :) substitusi adalah tidak benar dan saya tidak yakin bagaimana menggunakan kedua mvdan sedperintah dengan -execdi find.

Apakah saya memerlukan skrip bash untuk ini?

Caleb
sumber

Jawaban:

12

Ini adalah salah satu cara untuk melakukan ini di Bash:

for i in *; do [ "${i/%MP3/mp3}" != "$i" ] && echo "$i" "${i/%MP3/mp3}"; done

Saya telah menggunakan di echosini sehingga perintah itu sendiri tidak melakukan apa pun selain mencetak pasangan nama file. Jika daftar itu mewakili perubahan yang ingin Anda buat, maka Anda dapat mengubah echosesuatu seperti mv -i --yang kemudian akan memindahkan file Anda (dan meminta Anda sebelum menimpa).

Penjelasan singkat:

The forberiterasi setiap file cocok dengan *. Kemudian, kami menentukan apakah ekstensi sudah huruf kecil, jika kami pindah, jika tidak, kami melanjutkan untuk memindahkannya (atau menggemakannya, tergantung kasusnya). Ini menggunakan operasi string bawaan Bash yang dapat Anda baca di sini: http://tldp.org/LDP/abs/html/string-manipulation.html

Steven D
sumber
Terima kasih atas jawaban Anda dan mengarahkan saya ke tautan tentang manipulasi string bash!
7

Dalam zsh:

autoload zmv
zmv '(*).MP3' '$1.mp3'   # rename files in the current directory only
zmv '(**/)(*).MP3' '$1$2.mp3'  # rename files in subdirectories as well

Untuk juga mengurus .Mp3atau .mP3file:

zmv '(**/)(*).(#i)mp3' '$1$2.mp3'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
6

Anda dapat menggunakan perintah rename (waspadalah ada dua implementasi utama dengan API yang berbeda) untuk itu. Misalnya untuk mengubah kasus ekstensi nama file dari atas ke bawah, coba ini:

  • dengan renamedari util-linux(kadang-kadang disebut rename.ul), dengan asumsi .JPGhanya terjadi sekali dalam nama file

    rename -- .JPG .jpg *.JPG
  • dengan renamedari perl(kadang-kadang disebut prename; beberapa varian telah diterbitkan):

    rename 's/\.JPG$/.jpg/' ./*.JPG

Berikut adalah beberapa tutorial tentang bagaimana ia berpindah dari skrip bash yang berantakan ke perintah sederhana ini untuk kasus penggunaan Anda.

Perintah mewah lain untuk melakukan ini adalah pax. Jika Anda menggunakan ZSH untuk shell Anda, Anda juga bisa menggunakannya zmv.

Caleb
sumber
super! persis apa yang saya butuhkan
JoshP
Saya mendapatkan kesalahan syntax error at (user-supplied code), near ".", ketika saya menjalankan perintah ini.
Ryan Gates
3

Gunakan perl-rename , swiss army knife dari penggantian nama file dengan ekspresi reguler (di ubuntu, paket ini dibundel dengan paket perl sebagai prename):

# Replace prename as appropriate (i.e. if you've got it installed under a different name
find /RootPath -type f -iname '*.mp3' -print0 | xargs -0 prename 's/mp3$/mp3/i'

Jika Anda termasuk orang yang berhati-hati, gunakan opsi -n dan -v untuk perl mengganti nama untuk melihat apa yang sebenarnya akan dilakukan.

Kjetil Jorgensen
sumber
Terima kasih atas jawaban anda. Tidak memiliki perlrename di server, tapi saya akan bermain-main dengannya hari ini!
0

Anda memerlukan skrip, karena "ekstensi" di Linux sebenarnya hanya bagian dari string nama file. Anda harus melakukan manipulasi string dalam skrip untuk mendapatkan nama baru.

#!/bin/bash
for NAME in *.JPG
do
    PREFIX=${NAME%.*}
    NEWNAME="$PREFIX.jpg"
    mv "$NAME" "$NEWNAME"
done

Kutipan ganda penting jika Anda memiliki nama file dengan spasi putih di dalamnya. Saya pikir beberapa kutipan ganda agak tidak jelas.

Bruce Ediger
sumber
1
Tidak ada yang salah per-katakan dengan skrip Anda tetapi Anda sangat menantang tidak memerlukan skrip untuk ini. Mungkin ada selusin cara untuk melakukannya pada satu baris di kebanyakan shell, dan banyak utilitas untuk membuatnya mudah juga.
Caleb
0

Dalam bash:

# renaming files in the current directory only
for f in *.MP3; do mv "$f" "${f%.MP3}.mp3"; done  

# renaming files in subdirectories as well
for f in *{,/*}.mp3; do mv "$f" "${f%.MP3}.mp3"; done
Maxime R.
sumber
0

pertama-tama buat cadangan file Anda! Anda bisa menggunakan python one-liner:

python -c "import glob,os; [os.rename(fn, fn.replace('.MP3', '.mp3')) for fn in glob.glob('PATH_TO_YOUR_DIRECTORY')]"

EDIT:

Berikut adalah penjelasan terperinci tentang bagaimana one-liner sebenarnya bekerja. Menggunakan python -ckami melewati perintah ke juru bahasa python. Setelah mengimpor pustaka osuntuk renamefungsi dan globuntuk daftar file, kita perlu beralih melalui daftar file di direktori yang diberikan, yang saya panggil PATH_TO_YOUR_DIRECTORY, misalnya sesuatu seperti ./*untuk semua yang ada di direktori saat ini.

Dalam sintaks satu-liner sayangnya forloop tidak berfungsi setelah importnotasi, jadi kita perlu menggunakan notasi braket. Yaitu untuk setiap file atau nama direktori yang globmemberi kita dari jalur yang diberikan dalam bentuk string, kita ganti * .MP3 ke * .mp3.

Karena OP tidak menyebutkan pencarian rekursif, saya tidak memasukkannya di tempat pertama.

xaratustra
sumber