Salin / ganti nama banyak file menggunakan ekspresi reguler (skrip shell)

8

Saya memiliki koleksi file yang cocok dengan pola seperti 'assignment02.cc', 'assignment02.h', 'assignment02.txt', dll. Saya ingin menyalin / mengganti nama file-file ini menjadi 'assignment03.cc', 'assignment03. h ',' assignment03.txt ', dan seterusnya.

Saya menduga ini harus langsung menggunakan skrip shell dan sed. Sejauh ini saya punya:

OLD_NO=$1
NEW_NO=$2

echo "Moving from $OLD_NO to $NEW_NO"

for name in assignment$OLD_NO.* ; do
  newname=$(echo $name | sed 's/\(.*\)$OLD_NO\(.*\)/\1xx$NEW_NO\2/')
  echo "$name -> $newname"
  # mv -v $name $newname
done

Sayangnya cara saya memohon sed selalu mengembalikan string input $namedan tidak benar-benar melakukan pencarian / ganti regex.

Catatan: Mencari di internet ada renameperintah yang memiliki fungsi ini, tetapi itu tidak tersedia di MacBook saya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ubah tanda kutip tunggal menjadi tanda kutip ganda. Jika Anda memiliki tanda kutip tunggal di sekitar perintah sed, maka $OLD_NOdan $NEW_NOtidak akan diperluas.
Mikel
newname=$(echo $name | tr $OLD_NO $NEW_NO)
Nizam Mohamed

Jawaban:

5

Menggunakan sed di sini memperkenalkan lebih banyak kompleksitas daripada nilainya. Gunakan fitur manipulasi teks built-in shell. Misalnya, ${name#assignment02}cabut awalan assignment02dari $name.

for name in assignment02.*; do
  mv "$name" "assignment03${name#assignment02}"
done

Kutipan ganda tidak diperlukan jika Anda yakin nama file tidak mengandung karakter khusus shell.

Jika Anda memiliki zsh tersedia, zmvfungsinya sangat membantu untuk jenis renamings ini.

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
3

Kamu sudah berpikir terlalu rumit

rename 02 03 *02*

'rename' menggantikan arg pertama ('02') dengan arg kedua ('03') atas nama semua file yang diberikan pada arg3 atau sesudahnya (* 02 *)

Patrick
sumber
The renameperintah dengan sintaks ini adalah utilitas Linux, tidak tersedia di OSX (dan bahkan tidak tersedia dengan nama ini pada kebanyakan Debian dan Ubuntu instalasi).
Gilles 'SO- stop being evil'
Ah, tidak tahu Anda berada di osx, payah
Patrick
Ganti nama adalah skrip perl, sehingga mungkin akan berjalan pada OS X. Ditemukan di sini menggunakan google: tips.webdesign10.com/files/rename.pl.txt
azzid
0

Pendekatan yang berbeda:

for ext in {cc,h,txt}
do 
  echo mv assignment02.$ext assignment03.$ext
done

Dalam jangka panjang: Cobalah untuk mendapatkan 'rename'

Pengguna tidak diketahui
sumber
-1

Salah satu cara Anda dapat melakukannya adalah:

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh
mazianni
sumber
2
Jangan parsing output darils . Dan menghasilkan skrip shell adalah cara pasti untuk menembak diri sendiri di kepala. Pertanyaan Vault Boy berisi pendekatan yang masuk akal di sisi shell, hanya melewatkan mantra sed yang tepat dan beberapa kutipan.
Gilles 'SO- stop being evil'