Yanıtlar:
Basit bir 1-astar yapmalıdır (Posix sh
uyumlu kabuk olduğunu varsayar ):
for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done
Açıklama:
for ... in ...; do ...; done
bir 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
mv
ilk 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) ( tr
değ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_name
değişkeni şu şekilde ayarlayın :
new_name=$(ls | grep $p | tr ':-' '_' | sed 's/_\./\./')
mv $old_name $new_name
Not: mv
Yeniden 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 "-" *
rename
birç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 ...