Dosyaları yeniden adlandırırken boşlukları değiştirmekten kaçının


10

Ben böyle dosyaları yeniden adlandırmaya çalışıyorum:

for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done

Ancak sedkomut tüm boşlukların yerine geçer _.

sedBelirtilen karakterlerle birlikte boşluk bırakmasını sağlamak için komutu nasıl düzenleyebilirim ? Kullanmayı denedim \sama çalışmıyor ...

EDIT:
Örneğin: dosya trip: hill, yeniden adlandırılmalıdır:, trip_ hillancak yukarıdaki komut bunu yapar trip__hill.


Bazı dosyaları Linux'tan Mac'e taşıyorum. Ancak bir nedenle Mac sistemi tüm dosya adlarını okuyamıyor, bu yüzden dosyalarımı yeniden adlandırmaya çalışıyorum. Yukarıdaki komuta boşluk eklemek işe yaramıyor. Ve haklısın: Belirtilenler dışındaki tüm karakterleri '_' ile değiştirmek istiyorum. Ve uzay karakolunu nasıl dahil edeceğimi bilmiyorum.

Belirtilenler dışında tüm karakterleri '_' ile değiştirmeye çalıştığımı lütfen unutmayın. Yeniden adlandırılan dosyalar için belirli bir desen yoktur, bu yüzden bu perl komutunu kullanamıyorum.

Yanıtlar:


11

Dosya adlarını ayrıştırmayın sed! Çıkışı echo "$file"güvenilir olmayabilir.

Kullanın rename. 17.10'da önce yüklemeniz gerekir

sudo apt install rename

Sonra:

rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *

notlar

  • -ndosyaları gerçekten yeniden adlandırmak için test ettikten sonra kaldır
  • -- herhangi bir dosyanın başlaması durumunda seçenek sonu -
  • [^-A-Za-z0-9_ .]Değiştirmek istemediğimiz karakterler - -önce veya son olarak koymak , bir aralığı gösterememesi için (bu konumlarda tam anlamıyla ele alınır).
  • Alanlar sınıfa dahil edilebilir
  • . kelimenin tam anlamıyla ele alınır (diğer regex bağlamlarında herhangi bir karakter anlamına gelir ve kaçması gerekir).

Bu ayrıca şu şekilde çalışır sed:

$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill

Sürümünüzün sonuna bir boşluk eklersem bir hata alıyorum:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end

Ama -sonunda, işe yarıyor:

$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill

Belki de alanı eklediğinizde kısa çizginin konumu sorununuza neden oldu. Ancak dosya adlarını ayrıştırmama tavsiyesi duruyor!


Bu komut işe yarıyor teşekkürler. Kullandığım komuttaki hataları da açıkça tanımladınız.

2
Tekrar teşekkürler. Sed kullanıldığında eğik çizgi '\' kullanmaya gerek olmadığını lütfen unutmayın. Çünkü bu, yok sayılan karakterlerin listesine '\' ekler.

2
@latach Bu bir ters eğik çizgi, ama kesinlikle haklısın. Test ettikten ve etrafı .kazdıktan sonra, bir karakter sınıfında gerçek olduğunu gördüm . TIL!
Zanna

2

Kabuğu da kullanabilirsiniz, Bash'in parametre genişletmesi ikame yapabilir:

for f in ./* ; do
    mv "$f" "${f//[^-A-Za-z0-9._ ]/_}"
done

Çift eğik çizgi, sözdiziminin basit olması dışında, tüm eşleşmeleri değiştirmesini söyler.

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.