Jawaban:
Seharusnya 1-liner sederhana (mengasumsikan sh
shell yang kompatibel dengan Posix ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Penjelasan:
for ... in ...; do ...; done
adalah sebuah loop
*:*
cocok dengan semua file dan direktori di direktori saat ini yang ada :
di namanya
f
ditugaskan pada gilirannya untuk masing-masing nama file dalam loop
mv
mengganti nama argumen pertamanya menjadi argumen kedua; -v
(verbose) memintanya untuk mencetak apa fungsinya; opsi ini khusus untuk GNU-utils , sehingga tersedia di Linux tetapi tidak untuk Solaris
$(...)
mengeksekusi kode dalam sub-shell dan mengganti output
echo
mencetak argumennya ke output standar
tr
membaca output standar dan menerjemahkan karakter sesuai dengan peta yang disediakan
Jika Anda menggunakan bash , Anda dapat menghindari melahirkan shell tambahan ( $()
) dengan sub-proses ( tr
) dengan mengganti $(...)
dengan ${f//:/-}
.
$(echo "$f" | tr ':' '-')
dengan "${f//:/-}"
dan menghindari panggilan subkulit, pipa, dan program eksternal. Saya pikir ini bashism, tapi eh. Lihat di sini .
Seperti yang dinyatakan dalam pos lain oleh saya rename
alat ini bisa melakukan trik untuk Anda. Anda hanya perlu mengetik
rename s/:/-/ <files to rename>
ini menggantikan setiap titik dua dengan tanda hubung di semua file yang Anda beri nama di akhir, yaitu2013-10-*
Inilah tautan ke Posting saya yang lain
Saya yakin pro UNIX bisa melakukan ini dengan bash, tapi inilah versi cepat dan kotor saya dengan ruby.
path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
`mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end
set path_to_files ke path ke file yang salah nama Anda. simpan kode di atas dalam file bernama rename.rb lalu:
username@machinename$ ruby rename.rb
Jika Anda hanya memiliki satu atau beberapa file, ini dapat melakukan penggantian nama untuk Anda:
p="201*"
.old_name=$(ls | grep $p)
.Simpan nama file baru dengan penggantian karakter yang diperlukan:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
Pembersihan bonus :
a. Jika demi keseragaman Anda ingin mengganti tanda hubung (-
) bersama titik dua (:
) dengan garis bawah (_
), Anda dapat melakukan ini:
new_name=$(ls | grep $p | tr ':-' '_');
b. Jika Anda ingin garis bawah terakhir (sesaat sebelum .txt
) hilang, tetapkan new_name
variabel sebagai:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB: mv
akan gagal jika ada nama file dalam operasi penggantian nama yang ada spaces
di dalamnya. Dalam hal itu, bungkus variabel yang sesuai dalam tanda kutip, seperti: mv "$old_name" $new_name
ATAU mv $old_name "$new_name"
ATAU mv "$old_name" "$new_name"
1a: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | sed 's/:/_/g'); mv $old_name $new_name
1b: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':' '_'); mv $old_name $new_name
2: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_'); mv $old_name $new_name
3: p="201*"; old_name=$(ls | grep $p); new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./'); mv $old_name $new_name
Ini mungkin berlebihan tetapi Anda dapat mengganti nama karakter khusus dengan skrip di tautan yang disediakan dalam jawaban ini:
for f in
loop ... adalah loop yang mengulang semua file dalam direktori saat ini di mana file harus cocok*:*
. (Apa yang terjadi dengan dir yang cocok?). Perintah pindah adalah pindah nama lama dengan nama baru di mana nama baru dihasilkan dengan mengeksekusi shell dengan$( subshell here )
. Apa yang dilakukan, ...