Jawaban:
Seharusnya 1-liner sederhana (mengasumsikan shshell yang kompatibel dengan Posix ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Penjelasan:
for ... in ...; do ...; doneadalah 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
mvmengganti 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 renamealat 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_namevariabel sebagai:
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
NB: mvakan gagal jika ada nama file dalam operasi penggantian nama yang ada spacesdi 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 inloop ... 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, ...