Yanıtlar:
Basit bir 1-astar yapmalıdır (Posix shuyumlu kabuk olduğunu varsayar ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Açıklama:
for ... in ...; do ...; donebir döngü
*:* geçerli dizindeki :adında bulunan tüm dosya ve dizinlerle eşleşir
f döngüdeki her bir dosya adına sırayla atanır
mvilk argümanını ikincisine yeniden adlandırır; -v(ayrıntılı) yaptıklarını yazdırmasını ister; bu seçenek GNU-utils'e özgüdür, bu yüzden Linux'ta kullanılabilir, ancak Solaris'te mevcut değildir
$(...) kodu bir alt kabukta çalıştırır ve çıktıyı değiştirir
echo argümanını standart çıktıya yazdırır
tr standart çıktıyı okur ve verilen haritaya göre karakterleri çevirir
Eğer kullanıyorsanız bash , ekstra kabuk (yumurtlama önleyebilirsiniz $()alt süreçlerle) ( trdeğiştirerek) $(...)ile ${f//:/-}.
$(echo "$f" | tr ':' '-')ile "${f//:/-}"ve altkabuk, boru ve dış programı aramayı kaçının. Bence bu bir bashizm, ama ha. Buraya bakın .
Eminim bir UNIX pro bunu bash ile yapabilir, ama burada yakut ile hızlı ve kirli versiyonum.
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
path_to_files dosyasını yanlış adlandırılmış dosyalarınızın yoluna ayarlayın. Yukarıdaki kodu rename.rb adlı bir dosyaya kaydedin ve sonra:
username@machinename$ ruby rename.rb
Yalnızca bir veya birkaç dosyanız varsa, bu yeniden adlandırma işlemini sizin için yapabilir:
p="201*".old_name=$(ls | grep $p).Mağaza Yeni bir dosya adı gerekli karakter değiştirmeler ile:
new_name=$(ls | grep $p | sed 's/:/_/g') # Using 'sed'
OR
new_name=$(ls | grep $p | tr ':' '_') # Using 'tr'
Bonus temizleme :
a. Tekdüzelik uğruna çizgileri (-) iki nokta üst üste işaretleriyle (:) alt çizgi (_) ile değiştirmek istiyorsanız, bunu yapabilirsiniz:
new_name=$(ls | grep $p | tr ':-' '_');
b. Son alt çizginin (hemen öncesinden .txt) da gitmesini istiyorsanız, new_namedeğişkeni şu şekilde ayarlayın :
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
Not: mvYeniden adlandırma işleminde dosya adlarından herhangi birinin içinde bulunması durumunda başarısız olur spaces. Bu durumda, uygun değişkenleri tırnak içine alın, örneğin: mv "$old_name" $new_name VEYA mv $old_name "$new_name" VEYA VEYA 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
renamer kullanarak :
$ renamer --find ":" --replace "-" *
renamebirçok linux dağıtımına önceden kurulmuş bir araçtır. Ancak Windows için bu aracın harika olabileceğini düşünüyorum.
Bu aşırıya kaçmış olabilir, ancak bu yanıtta sağlanan bağlantıdaki komut dosyasıyla özel karakterleri yeniden adlandırabilirsiniz:
for f in... döngü, geçerli dizindeki dosyaların eşleşmesi gereken tüm dosyalar üzerinde yinelenen bir döngüdür*:*. (Eşleşen dirslere ne olur?). Move komutu, bir kabuk çalıştırılarak yeni adın oluşturulduğu bir move oldname yeni adıdır$( subshell here ). Tr ne yapar ...