Saya ingin huruf kecil setiap nama direktori di bawah direktori. Dengan perintah apa saya bisa melakukannya?
Jawaban yang Diterima:
Semua direktori pada satu tingkat, atau secara rekursif?
Zsh
Pada satu tingkat:
autoload zmv
zmv -o-i -Q 'root/(*)(/)' 'root/${1:l}'
Secara rekursif:
zmv -o-i -Q 'root/(**/)(*)(/)' 'root/$1${2:l}'
Penjelasan:zmv
mengganti nama file yang cocok dengan pola sesuai dengan teks pengganti yang diberikan. -o-i
melewati -i
opsi untuk setiap mv
perintah di bawah tenda (lihat di bawah). Dalam teks pengganti, $1
, $2
, dll, adalah grup yang diberi tanda kurung berturut-turut dalam pola. **
berarti semua (sub)*direktori, secara rekursif. (/)
final terakhir bukan grup yang dikurung tetapi kualifikasi glob yang berarti hanya cocok dengan direktori. ${2:l}
mengonversi $2
menjadi huruf kecil.
Portabel
Pada satu tingkat:
for x in root/*/; do mv -i "$x" "$(printf %s "$x" | tr '[:upper:]' '[:lower:]')"; done
/
final terakhir membatasi pencocokan ke direktori, dan mv -i
membuatnya meminta konfirmasi jika terjadi tabrakan. Hapus -i
untuk menimpa jika terjadi tabrakan, dan gunakan yes n | for …
. untuk tidak diminta dan tidak melakukan penggantian nama apa pun yang akan bertabrakan.
Secara rekursif:
find root/* -depth -type d -exec sh -c '
t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
[ "$t" = "$0" ] || mv -i "$0" "$t"
' {} ;
Penggunaan -depth
memastikan bahwa direktori yang sangat bersarang diproses sebelum leluhurnya. Pemrosesan nama bergantung pada keberadaan /
; jika Anda ingin memanggil operasikan di direktori saat ini, gunakan ./*
(menyesuaikan skrip shell untuk mengatasi .
atau *
dibiarkan sebagai latihan untuk pembaca).
Perl ganti nama
Di sini saya menggunakan skrip rename Perl yang dikirimkan oleh Debian dan Ubuntu sebagai /usr/bin/prename
(biasanya tersedia sebagai rename
demikian juga). Pada satu tingkat:
rename 's!/([^/]*/?)$!L/$1!' root/*/
Secara rekursif, dengan bash 4 atau zsh:
shopt -s globstar # only in bash
rename 's!/([^/]*/?)$!L/$1!' root/**/*/
Secara rekursif, portabel:
find root -depth -type d -exec rename -n 's!/([^/]*/?)$!L/$1!' {} +