Jawaban:
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
Do not add #!/bin/sh? Saya mencoba keduanya bekerja dengan / tanpa pernyataan ini.
#!/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
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
ls? apa yang rename ...kamu coba
renamebukan alat Unix standar.
brew install rename
'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
.cocok dengan karakter APA SAJA, bukan hanya titik - untuk titik literal, gunakan \.sebagai gantinya
for f in *.png; do
fnew=`echo $f | sed 's/_h.png/_half.png/'`
mv $f $fnew
done
mv $f $fnewdengan echo $fnewsebagai baris kedua untuk memastikan output terlihat waras.
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 .
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
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:
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
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