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 $1
ve $2
değ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 -i
iletmek anlamına gelir .-i
mv
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: case
deyimi, 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 target
bulunan 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 find
desteklemiyorsa -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
' _ {} +