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?

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 pederst@cpan.org
$

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
$

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).


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.


1

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

rename 'IMG' 'img' * ; rename 'JPG' 'jpg' *

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.