Ganti nama file di folder lokal dengan menambahkan awalan atau akhiran

12

Saya memiliki banyak file di folder dan saya ingin menambahkan awalan atau akhiran (tidak keduanya ). Saya memeriksa di sini dan menemukan bahwa saya dapat menggunakan

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

untuk menambahkan awalan ke semua file yang diakhiri .jpg(dan jika saya menghapus .jpg, itu akan menambahkan awalan ke semua file di folder saat ini).

Namun, saya ingin bisa

  • Tambahkan sufix (yaitu, ganti nama filename.extmenjadi filename.whatever.ext),
  • Periksa apakah awalan atau akhiran sudah ada dan kemudian lewati,
  • Buat alias yang menerima argumen seperti addprefix whatever *.extatauaddsufix whatever *.*
Orang Brasil itu
sumber

Jawaban:

10

Jika Anda menggunakan bash, maka liner satu ini dapat melakukannya untuk Anda (dengan asumsi Anda memiliki variabel $prefix, $suffixdan $extensionsudah tersedia)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

Anda bisa membuat skrip Anda seperti ini

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

dan

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done
Aaron Okano
sumber
Itu hampir sempurna! Akan sempurna jika (1) memeriksa apakah awalan atau sufiks sudah ada (dan kemudian dilewati), dan (2) bekerja pada file tanpa ekstensi. Maaf telah mengganggu begitu banyak ...
Orang Brasil itu
Untuk (1) Anda bisa (saya pikir, tidak diuji) menambahkan cek awalan dengan membungkus mv dalam sebuah if [ $f == $prefix* ]dan Anda dapat mengubah sufiks satu dengan if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]sekitar beberapa perintah mv di adduffix. Untuk (2) seharusnya sudah berfungsi pada file tanpa ekstensi, kecuali saya seorang programmer yang mengerikan.
Aaron Okano
7

Ada perintah Perlrename yang harus melakukan trik. Hati-hati: ada beberapa perintah berbeda yang dipanggil rename, jadi pastikan Anda telah mendapatkan skrip Perl yang mengharapkan perlexprargumennya. Ini adalah renameperintah yang disediakan oleh perlpaket pada Debian dan turunannya (Ubuntu, Mint, ...), tetapi tidak pada distribusi lain yang mungkin memiliki utilitas berbeda yang disebut rename.

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

Seperti yang Anda lihat, ini idempoten - itu tidak akan menambah awalan lagi ketika Anda menyebutnya berkali-kali.

Ia bekerja dengan mengganti awal (nol-panjang) dari string ( ^) atau mulai diikuti oleh prefixstring opsional dengan prefix.

Saya akan meninggalkan encapsulating ini dalam skrip shell atau fungsi shell sebagai latihan untuk Anda :)

Postfix sedikit lebih sulit, karena Anda harus mencari tahu bagian mana dari nama file yang merupakan ekstensi ...

Martin von Wittich
sumber
Itu jawaban yang bagus, tetapi saya sedang mencari sesuatu yang lebih universal; untuk jawaban ini Anda perlu perl dan khusus ini (atau yang setara) renamehadir. Dan saya tahu sufiks sedikit lebih sulit, itu tidak tercakup dalam pertanyaan terkait, dan saya seorang pemula di linux, bash, shell script, perl dan ekspresi reguler, jadi "sedikit lebih keras" cukup sulit bagi saya ! :)
Orang Brazil itu,
4

Dengan zsh:

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~adalah operator globbing yang berarti kecuali dalam zsh.

Stéphane Chazelas
sumber
1

Contoh sederhana untuk mengubah awalan dan ekstensi semua gambar di folder saat ini.

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

Jika Anda ingin memeriksa bagaimana itu akan mempengaruhi data Anda sebelum mengubahnya ganti mv dengan gema

output untuk IMG_7993.JPG adalah EG_IMG_7993.jpg

Jinxi
sumber