Batch mengubah nama file menjadi huruf kecil

17

Apakah ada cara untuk mengganti nama semua file dalam direktori menjadi huruf kecil |

Saya mencari perintah oneliner .

Saya menyukai TotalCommander's alt+f7, sekarang saya membutuhkan fungsi itu di Terminal

Unamata Sanatarai
sumber

Jawaban:

20

Untuk setiap file a_filedalam direktori saat ini ganti nama a_filemenjadi huruf kecil.

for a_file in *;do mv -v "$a_file" `echo "$a_file" | tr [:upper:] [:lower:]` ;done;

Untuk huruf besar, balik argumen menjadi [:lower:] [:upper:]

trtautan referensi perintah

Memperbarui

Bahkan kontrol lebih banyak *bisa diganti ls.

Misalnya dalam direktori yang berisi 1.txt, 2.txt, 3.txt, 1.jpg, 2.jpg dan 3.jpg untuk memfilter hanya file * .jpg, lsdapat digunakan:

for a_file in $(ls *.jpg);do mv -v $a_file `echo $a_file | tr [:upper:] [:lower:]` ;done;

Kode di atas akan menetapkan a_filevariabel semua file dengan ekstensi .jpg.

Memperbarui menambahkan -vopsi untuk mvperintah sebagai per sds disarankan.

Stef K
sumber
4
Anda mungkin ingin meneruskan "-v" mvsehingga Anda melihat apa yang sedang dilakukan; Anda mungkin tidak ingin meneruskan "-f" karena ini dapat merusak file yang ada
sds
Ini tidak berfungsi untuk file dengan spasi di namanya.
Tianxiang Xiong
Anda dapat menggunakan tanda kutip di sekitar nama file.
Stef K
2
Maaf, tetapi bagian tentang ls * jpg adalah ide yang buruk . mywiki.wooledge.org/ParsingLs Anda dapat mencapai hasil yang sama dengan * jpg di mana Anda memiliki * di tempat pertama.
tink
16

Ada utilitas yang lebih elegan dan umum disebut prename.

Ditulis oleh Larry Wall, ia hadir perlsehingga kemungkinan besar sudah tersedia di sistem Anda/usr/bin/prename (jika Anda memiliki alternatif pengaturan mungkin juga tersedia sebagai /usr/bin/renameterhubung melalui / etc / alternative to prename)

Dengan menggunakannya Anda dapat mengganti nama banyak file dalam satu perintah dengan memberikan ekspresi perl (termasuk tetapi tidak terbatas pada substitusi) s/// atau transliterasi karakter tr///):

Contoh:

# Lowercase all *.JPG filenames:
prename tr/A-Z/a-z/ *.JPG

# Change any 'No' in a filename to a 'Yes':
prename s/No/Yes/g *No*

# increment first sequence of digits in a filename by 3:
prename 's/([0-9]+)/$1+3/e' *[0-9]*

# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}'  *

Dan seterusnya.

Satu hal baik tentang prename adalah ia melindungi Anda, dalam hal mengganti nama file menjadi nama file yang ada.

man prename untuk lebih jelasnya.

diri sendiri
sumber
1

Menggunakan find

find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;

Untuk find

  • Tentu saja setelah -namemeletakkan polanya.
  • -maxdepth 0: Hanya direktori saat ini.

Untuk rename

  • -n, -nono: Tidak ada tindakan: cetak nama file yang akan diganti nama, tetapi jangan ganti nama.
  • y/source/dest/: Menerjemahkan karakter dalam ruang pola yang muncul di sumber ke karakter yang sesuai di dest.
Pablo Bianchi
sumber