Linux kabuğunu kullanarak dosyaları boşluklarla nasıl yeniden adlandırabilirim?


28

İçinde boşluk olan bir dizi dosyayı adlandırdım ve boşluğu değiştirmek istiyorum _. Bununla birlikte, her seferinde kabukta bir dosya adı (örneğin Spring 2011) olan bir komut yazdığımda, kabuk dosyayı veya dizini tanımıyor.

Bu konuda ne yapabilirim? Unicode karakteri bir boşluk için kullanmanın bir yolu var mı?


N dosyalarını programlı olarak yeniden adlandırmak için, bir bashfor döngüsü kullanın : burada benim çözümüme bakın .
Trevor Boyd Smith

Yanıtlar:


33

Örneğin Spring\ 2011, alandan çıkın veya örneğin tırnak işaretleri kullanın 'Spring 2011'. Gelecekte, herhangi bir * NIX'te boşluk içeren dosya adlarını kullanmak genellikle kötü bir fikirdir.

Eğer varsa rename, bunu kullanabilirsiniz:

rename ' ' '_' [filenames...]

1
Bir kerede tüm dosyalar için bunu yapmak için zaten var biliyor musunuz?

3
Neden kötü bir fikir? Dosya adlarını doğru bir şekilde işlemek programcının sorumluluğundadır.
glenn jackman

1
@ rafe, gerçekten dosya adlarını doğru bir şekilde işlememeye eğilimli bir hatadır. Ekstra çaba, yalnızca bir dosya adı içeren değişkenleri alıntılamayı unuttuğunuzda bir komut dosyasında hata ayıklamak zorunda kaldığınızda ortaya çıkar.
glenn jackman

3
Bu cevap işe yaramadı (en azından Ubuntu 12.04 LTS'de). Unutbu'nun cevabı yine de iyi çalışıyor.
DNA

1
bu sadece benim için ilk boşluğu yaptı ... ki bu faydalı değil ( rename2.23 sürümüne sahibim)
Trevor Boyd Smith

30

Makinenizde yeniden adlandırma komutu varsa, bu, geçerli çalışma dizinindeki tüm dosyalarda / dizinlerde tüm boşlukların altını çizecek:

rename 's/ /_/g' *

Ubuntu
12.04'te

1
benim için işe yaramadı ... "yeniden adlandırmak: yeterli tartışmalar" hatası alıyorum. i sürümüne sahip rename --version rename from util-linux 2.23.2.
Trevor Boyd Smith

24

Eğer renamesadece kabuğu kullanmamış veya kullanmayı tercih etmiyorsanız :

for f in *\ *; do mv "$f" "${f// /_}"; done

Bozuldu:

  • *\ *forDöngü için girdi olarak adlarında boşluk olan tüm dosyaları seçer .
  • Buradaki alıntılar "$f"önemlidir, çünkü dosya adında bir boşluk olduğunu biliyoruz ve aksi takdirde 2+ argüman olarak görünecektir mv.
  • ${f//str/new_str}bash özgü bir dize değiştirme özelliğidir. Tüm örnekleri strile değiştirilir new_str.

2
bu işe yarıyor ama benim için sadece ilk boşluğun yerini alıyor. kullanırsam for f in *\ *; do mv "$f" "${f// /_}"; doneçalışırsa
billynoah

@billynoah İyi yakalamak, güncellendi.
blahdiblah

@blahdiblah Çok teşekkür ederim! Beni çok zaman kurtardın!
Gerilla

@blahdiblah sizin çözümünüz benim çözümümden çok daha zarif . aferin. For döngü küresinin işe yarayacağını düşünmemiştim ... bu yüzden küreyi formanın dışında yaptım.
Trevor Boyd Smith

3

mv "Spring 2011.file" Spring_2011.file Komut satırına, alıntılanan dizgiyi tek bir girdi olarak alması gerektiğini söylemelisiniz.


Çalışabildiğim tek cevap bu.
saat

1

N dosyalarını programlı olarak yeniden adlandırmak bashiçin, döngü için basit bir kullanabilirsiniz .

#!/bin/bash

set -eux

# find all your files by using a `grep` pattern
pattern="insert_filename_pattern_here" # you must enter your filename pattern here

# create an array of filenames and split on newlines
IFS=$'\n'
tmp=($(ls | grep ${pattern}))
unset IFS

# for each filename
for filename in "${tmp[@]}"; do
    # rename the filename to use "_" character instead of a " " character
    mv -v "${filename}" "${filename// /_}"
done

5'ten daha az dosya adınız varsa, tüm dosya adlarını manuel olarak yazabilir renameve yukarıdaki çözümün önerdiği gibi komutu kullanabilirsiniz . Ama benim için ... sadece 4 dosya olsa bile ... programlı çözümü tercih ederim.

ps

BashParametre Genişletme (yani ${filename// /_}) konusuna aşina değilseniz, şu renamekomutu kullanabilirsiniz :

if ((0)); then
    mv -v "${filename}" "${filename// /_}"
else
    rename ' ' '_' "${filename}"
fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.