Ganti nama banyak file dengan 2 kondisi / penggantian dalam satu baris?

8

Saya mencoba mengganti nama beberapa gambar:

IMG_1.JPG
IMG_2.JPG
IMG_3.JPG

Saya ingin mengganti IMGdengan imgdan .JPGdengan .jpg- Saya tahu bagaimana melakukan bagian kedua:

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

Masalah saya adalah bahwa saya tidak bisa mv IMG_.JPGke img_.jpg- Aku tahu kau bisa melewati beberapa pola untuk rename, tapi saya tidak bisa menggunakan nama file yang ada dengan nilai huruf kecil diubah.

Bagaimana saya melakukannya?

treyBake
sumber

Jawaban:

10

Mungkin Anda harus menggunakan perintah perl rename. Di kotak CentOS saya, ini disebut 'nama samaran'.

$ ls
IMG_1.JPG  IMG_2.JPG  IMG_3.JPG
$ prename 's/^IMG/img/;s/\.JPG$/\.jpg/' *JPG
$ ls
img_1.jpg  img_2.jpg  img_3.jpg
$

$ prename -h
Usage: prename [OPTION]... PERLEXPR FILE...
Rename FILE(s) using PERLEXPR on each filename.

  -b, --backup                  make backup before removal
  -B, --prefix=SUFFIX           set backup filename prefix
  -f, --force                   remove existing destinations, never prompt
  -i, --interactive             prompt before overwrite
  -l, --link-only               link file instead of reame
  -n, --just-print, --dry-run   don't rename, implies --verbose
  -v, --verbose                 explain what is being done
  -V, --version-control=METHOD  override the usual version control
  -Y, --basename-prefix=PREFIX  set backup filename basename prefix
  -z, -S, --suffix=SUFFIX       set backup filename suffix
      --help                    display this help and exit
      --version                 output version information and exit

The backup suffix is ~, unless set with SIMPLE_BACKUP_SUFFIX.  The
version control may be set with VERSION_CONTROL, values are:

  numbered, t     make numbered backups
  existing, nil   numbered if numbered backups exist, simple otherwise
  simple, never   always make simple backups

Report bugs to [email protected]
$

Jika Anda ingin menggunakan renameperintah bodoh dari util-linux(kadang-kadang disebut rename.ul), mungkin perlu dilakukan dalam dua langkah, misalnya

$ ls
IMG_1.JPG  IMG_2.JPG  IMG_3.JPG
$ rename IMG img *JPG
$ rename JPG jpg *JPG
$ ls
img_1.jpg  img_2.jpg  img_3.jpg
$
steve
sumber
3
Perhatikan bahwa perl renamepredate the dumb renameditemukan di util-linux yang Anda panggil lamarename . Bahkan mendahului Linux.
Stéphane Chazelas
6

Untuk menjawab pertanyaan Anda dalam generik,

ganti nama banyak file dengan 2 syarat / penggantian dalam satu baris?

Anda biasanya akan menggunakan kelompok capture , merujuk kepada mereka dalam ekspresi pengganti menggunakan sesuai mereka backreferences . Sebagai contoh

$ rename -n 's/^(.*)_(.*)\.JPG$/\L$1_$2.jpg/' *.JPG
rename(IMG_2.JPG, img_2.jpg)
rename(IMG_3.JPG, img_3.jpg)

Namun, dalam kasus khusus ini, akan lebih mudah untuk hanya menerapkan pengubah huruf kecil \Lke seluruh nama:

$ rename -n 's/.*/\L$&/' *.JPG
rename(IMG_2.JPG, img_2.jpg)
rename(IMG_3.JPG, img_3.jpg)

Alternatif lain, menggunakan mmv

$ mmv -n '*.JPG' '#l1.jpg'
IMG_2.JPG -> img_2.jpg
IMG_3.JPG -> img_3.jpg

(hapus -nuntuk benar-benar melakukan penggantian nama).

Steeldriver
sumber
Atau zmv:zmv '*.JPG' '${(L)f}'
Stéphane Chazelas
1
Versi yang lebih sederhana rename 's/.*/\L$&/' *.JPGadalahrename '$_ = lc' *.JPG
hobbs
2

Menggunakan mv:

sh kompatibel:

for file in *.JPG; do mv "$file" "$(echo "$file" | tr '[:upper:]' '[:lower:]')"; done

bash (Terima kasih steeldriver):

for file in *.JPG; do mv "$file" "${file,,}"; done

Ini akan mengulang semua .JPGfile dalam direktori saat ini dan mengubah nama mereka ke nama yang sama dengan semua karakter huruf besar dikonversi ke karakter huruf kecil.

jesse_b
sumber
1

Cara paling sederhana dan berdasarkan halaman manual yang tidak mencakup ekspresi reguler :

rename 'IMG' 'img' * ; rename 'JPG' 'jpg' *
Hossein Vatani
sumber
IMHO, jawaban sederhana seperti ini mencapai apa yang gagal sesekali gagal gagal. Tidak ada kebencian terhadap programmer berpengalaman, tetapi karena pertanyaan itu tampaknya berasal dari seorang pemula, kesederhanaan perlu didorong.
Hopping Bunny