Üç alternatif önereceğim. Her biri basit bir tek satır komutudur, ancak esas olarak işlenecek dosyaların aynı doğrudan rotadaki diğer dosyalarla karıştırılması durumunda, daha karmaşık durumlar için varyantlar sunacağım.
mmv
Bana kalırsa doğru mmv komutunu
gelen aynı adlı pakette :
mmv '*HBO_DPM*' '#1dpm#2'
Bağımsız değişkenlerin dize olarak iletildiğini unutmayın, böylece glob genişlemesi kabukta gerçekleşmez. Komut tam olarak iki bağımsız değişken alır ve ardından dosya sayısı üzerinde sıkı sınırlar olmadan karşılık gelen dosyaları dahili olarak bulur. Ayrıca, yukarıdaki komutun ilk glob ile eşleşen tüm dosyaların yeniden adlandırılacağını varsaydığını unutmayın. Elbette daha spesifik olmakta özgürsünüz:
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
Aynı dizinde istenen sayı aralığının dışında dosyalarınız varsa, bu yanıtta aşağıda verilen sayılar üzerinden döngü ile daha iyi olabilirsiniz. Bununla birlikte, uygun desenlerle bir dizi mmv çağrısı da kullanabilirsiniz:
mmv 'sb_606_HBO_DPM_0089*' 'sb_606_dpm_0089#1' # 0089000-0089999
mmv 'sb_606_HBO_DPM_009*' 'sb_606_dpm_009#1' # 0090000-0099999
mmv 'sb_606_HBO_DPM_01[0-5]*' 'sb_606_dpm_01#1#2' # 0100000-0159999
mmv 'sb_606_HBO_DPM_016[0-2]*' 'sb_606_dpm_016#1#2' # 0160000-0162999
mmv 'sb_606_HBO_DPM_01630[01]?' 'sb_606_dpm_01630#1#2' # 0163000-0163019
mmv 'sb_606_HBO_DPM_016302[0-2]' 'sb_606_dpm_016302#1' # 0163020-0163022
sayılar üzerinde döngü
Herhangi bir şey yüklemekten kaçınmak istiyorsanız veya bu aralığın dışındaki eşleşmelerden kaçınarak sayı aralığına göre seçim yapmanız gerekiyorsa ve 74.023 komut çağrısını beklemeye hazırsanız, düz bir bash döngüsü kullanabilirsiniz:
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
Bu, dizide boşluk olmadığından burada özellikle iyi çalışır. Aksi takdirde, kaynak dosyanın gerçekten var olup olmadığını kontrol etmek isteyebilirsiniz.
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
for ((i=89000; i<=163022; ++i))
Brace genişlemesinin aksine, birkaç yıl önce bazı Bash sürümlerinden bu yana önde gelen sıfırları ele aldığını unutmayın . Aslında istediğim bir değişiklik, bu yüzden bunun için kullanım durumlarını gördüğüme sevindim.
İlave okumalar: Bash bilgi sayfalarında Brace Expansion , özellikle ilgili kısım {x..y[..incr]}
.
dosyalar üzerinde döngü
Başka bir seçenek, söz konusu tamsayı aralığında döngü yapmak yerine uygun bir glob üzerinde döngü yapmak olacaktır. Bunun gibi bir şey:
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
Yine bu bir mv
dosya başına çağrıdır. Ve yine döngü uzun bir öğe listesinin üzerindedir, ancak tüm liste bir alt işleme argüman olarak geçirilmez, ancak dahili olarak bash tarafından işlenir, bu nedenle sınır size sorun yaratmaz.
İlave okumalar: Bash bilgi sayfalarında Shell Parametre Genişletme , ${parameter/pattern/string}
diğerleri arasında belgeleme .
Sayı aralığını sağladığınız aralıkla sınırlamak istiyorsanız, bunun için bir kontrol ekleyebilirsiniz:
for i in sb_606_HBO_DPM_+([0-9]); do
if [[ "${i##*_*(0)}" -ge 89000 ]] && [[ "${i##*_*(0)}" -le 163022 ]]; then
mv "$i" "${i/HBO_DPM/dpm}"
fi
done
İşte ${i##pattern}
en uzun önek eşleşmesini kaldırır pattern
dan $i
. Bu en uzun önek herhangi bir şey, sonra alt çizgi, sonra sıfır veya daha fazla sıfır olarak tanımlanır. İkincisi, ayarlanan seçeneğe bağlı olarak *(0)
genişletilmiş bir glob paterni olarak yazılır . Baştaki sıfırların kaldırılması, sayıyı taban 8 değil, taban 10 olarak ele almak için önemlidir. Döngü bağımsız değişkeninde, aynı başlayan ancak bir ile bitmeyen dosyalarınız olması durumunda, bir veya daha fazla basamağı eşleştiren başka bir genişletilmiş glob'dur. numara.extglob
+([0-9])
ARG_MAX
sınırıyla çarpışan çok sayıda dosya nedeniyle burada çalışmaz . Bu soru açıkça bir komut satırı çözümü istediğinden, diğer sorudaki gibi (muhtemelen eşit) GUI çözümleri de eşleşmez.