Uyarı: Bu komutların çoğunu doğrudan tarayıcımda yazdım. Uyarıcı lector.
Zsh ve zmv ile :
zmv -o -i -Qn '(**/)(*)(D)' '${1//\//-}$2'
Açıklama: Kalıp **/*, geçerli dizinin alt dizinlerindeki tüm dosyalarla özyinelemeli olarak eşleşir (geçerli dizindeki dosyalarla eşleşmez, ancak bunların yeniden adlandırılması gerekmez). İlk iki parantez çifti , değiştirilen metin olarak $1ve $2değiştirilebilecek gruplardır . Son parantez çifti nokta D niteleyicisini ekler, böylece nokta dosyaları atlanmaz. mevcut bir dosyanın üzerine yazılıp yazılmayacağı sorulursa seçeneği -o -iiletmek anlamına gelir .-imv
Yalnızca POSIX araçlarıyla:
find . -depth -exec sh -c '
for source; do
case $source in ./*/*)
target="$(printf %sz "${source#./}" | tr / -)";
mv -i -- "$source" "${target%z}";;
esac
done
' _ {} +
Explanation: casedeyimi, geçerli dizini ve geçerli dizinin üst düzey alt dizinlerini atlar. satır başıyla sıyrılan ve tüm eğik çizgiler yerine tire işareti targetbulunan bir kaynak dosya adı ( $0) ./ve bir son içerir z. Son z, dosya adının yeni bir satırla bitmesi durumunda vardır: aksi takdirde komut ikamesi onu soyurur.
Eğer finddesteklemiyorsa -exec … +(OpenBSD, sana bakıyorum):
find . -depth -exec sh -c '
case $0 in ./*/*)
target="$(printf %sz "${0#./}" | tr / -)";
mv -i -- "$0" "${target%z}";;
esac
' {} \;
Bash (veya ksh93) ile, eğik çizgileri tire işareti ile değiştirmek için harici bir komut çağırmanıza gerek yoktur, ksh93 parametre genişletmesini dize değiştirme yapısıyla kullanabilirsiniz ${VAR//STRING/REPLACEMENT}:
find . -depth -exec bash -c '
for source; do
case $source in ./*/*)
source=${source#./}
target="${source//\//-}";
mv -i -- "$source" "$target";;
esac
done
' _ {} +