Şununla kullan bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
adında boşluk bulunan dosyaları arar. Dosya adları, -print0
özel dosya adlarıyla da başa çıkmak için sınırlayıcı olarak bir nullbyte ( ) ile yazdırılır . Sonra read
yerleşik nullbyte tarafından sınırlanmış dosya adlarını okur ve sonunda mv
boşlukları bir alt çizgi ile değiştirir.
EDIT: Dizinlerdeki boşlukları da kaldırmak istiyorsanız, biraz daha karmaşıktır. Dizinler yeniden adlandırılır ve daha sonra ad find
bulur tarafından erişilemez . Bunu dene:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
sort -rz
Bir klasörde en derin dosyalar taşımak için ilk ve klasörün kendisi sonuncu olacak böylece o, dosya sırasını tersine çevirir. Bu nedenle, tüm dosyalar ve klasör yeniden adlandırılmadan önce hiçbir zaman yeniden adlandırılan klasörler yoktur. mv
Döngüde komut çok değişti biraz. Hedef adında, yalnızca dosyanın taban adındaki boşlukları kaldırırız, aksi takdirde erişilemez.