Ganti nama semua file dalam direktori dari $ filename_h menjadi $ filename_half?

139

Sangat sederhana.

Bagaimana cara saya mengganti nama

05_h.png
06_h.png

untuk

05_half.png
06_half.png

Setidaknya, saya pikir itu sederhana, tetapi sulit bagi Google untuk hal semacam ini kecuali Anda sudah tahu.

Terima kasih....

Richard
sumber

Jawaban:

301

Cukup gunakan bash, tidak perlu memanggil perintah eksternal.

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

Jangan tambahkan #!/bin/sh

Bagi yang membutuhkan one-liner:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done
bash-o-logist
sumber
7
Penggunaan bagus pengganti string
bawaan
3
itu file / _h.png / _half.png regex?
user2799603
15
Tidak, formatnya seperti ini: $ {string / substring / subtitusi} - "pengganti kejadian pertama". Untuk info lebih lanjut, periksa lembar contekan ini (bagian "string"): bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider
11
Ada alasan Do not add #!/bin/sh? Saya mencoba keduanya bekerja dengan / tanpa pernyataan ini.
Ryan
6
@Ryan @Ishan Jain Bahkan itu menunjukkan backend shell yang harus menjalankan skrip. sh dan bash adalah shell yang berbeda sehingga dapat memengaruhi perilaku skrip dan sintaksis. Karena skrip menggunakan pengganti string bawaan bash, Anda harus menambahkan header #!/bin/bash. Ini mengatakan, bash biasanya adalah shell default di banyak komputer sehingga Anda tidak akan menemukan banyak perbedaan: D Anda dapat menemukan informasi lebih lanjut di sini
Cristian Ramon-Cortes
65

Coba renameperintah:

rename 's/_h.png/_half.png/' *.png

Memperbarui:

contoh penggunaan:

buat beberapa konten

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

solusi uji:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png
Michał Šrajer
sumber
1
@CarolineAlexiou: Saya menambahkan contoh sesi tes. Silakan dicoba. Anda mungkin memiliki kesalahan ketik. Apa output dari ls? apa yang rename ...kamu coba
Michał Šrajer
2
Tidak berfungsi di bash di Mac, fwiw. renamebukan alat Unix standar.
tandrewnichols
1
@tandrewnichols, cobalah homebrew - setelah diinstal, ganti nama tersedia dalam beberapa detik denganbrew install rename
Simbamangu
4
's//'sedangkan bagi saya rename tidak bekerja - saya mereferensikan laki-laki dan ada sinopsis sederhana rename [options] expression replacement file...rename from util-linux 2.23.2
:,
2
perlu diingat bahwa .cocok dengan karakter APA SAJA, bukan hanya titik - untuk titik literal, gunakan \.sebagai gantinya
Meisner
11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done
Karoly Horvath
sumber
1
Ini bagus untuk melakukan lari kering sebelumnya. Saya pertama kali diganti mv $f $fnewdengan echo $fnewsebagai baris kedua untuk memastikan output terlihat waras.
lobati
10

Apakah Anda mencari solusi bash murni? Ada banyak pendekatan, tetapi ini satu.

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

Ini menganggap bahwa satu-satunya file di direktori saat ini yang berakhiran _h.png adalah yang ingin Anda ganti namanya.

Jauh lebih spesifik

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

Anggap kedua contoh itu adalah satu-satunya milik Anda. file.

Untuk kasus umum, berkas mengubah nama di telah telah tertutup sebelum .

sorpigal
sumber
6

Gunakan renameutilitas yang ditulis dalam perl. Mungkin saja itu tidak tersedia secara default ...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png
Fredrik Pihl
sumber
4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done
ztank1013
sumber
4

Saya punya pertanyaan serupa: Di manual, ini menggambarkan rename as

rename [option] expression replacement file

jadi kamu bisa menggunakannya dengan cara ini

rename _h _half *.png

Dalam kode: '_h' adalah ekspresi yang Anda cari. '_half' adalah pola yang ingin Anda ganti. '* .png' adalah rentang file yang Anda cari untuk file target yang mungkin.

Semoga ini bisa membantu c:

James Yen
sumber
1

Pendekatan lain dapat secara manual menggunakan opsi mengubah nama batch

Klik kanan pada file -> Perintah Kustom File -> Ganti Nama Batch dan Anda dapat mengganti h. dengan setengah.

Ini akan berfungsi untuk gui berbasis linux menggunakan WinSCP dll

Easwar
sumber
0

Gunakan renameutilitas:

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png
C. Ramseyer
sumber
0

Satu liner:
for file in *.php ; do mv "$file" "_$file" ; done

Jadeye
sumber
0

Meskipun set jawaban sudah lengkap, saya perlu menambahkan satu lagi yang hilang.

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
Tharindu Sathischandra
sumber