GNU/Linux >> Belajar Linux >  >> Linux

Huruf Kecil Semua Direktori Di Bawah Direktori?

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!' {} +

Linux
  1. Cara Mengganti Nama Direktori di Linux

  2. Bagaimana Mengembalikan Kepemilikan Grup/pengguna Default Dari Semua File Di Bawah/var?

  3. Mensimulasikan Tautan Keras Ke Direktori?

  1. Unzip Semua File Di Direktori

  2. Cocokkan semua file di bawah semua direktori bersarang dengan shell globbing

  3. Jumlah maksimum file/direktori di Linux?

  1. Membuat, Menghapus, dan Mengelola Direktori di Linux

  2. Cara Menemukan File Di Linux Di Semua Direktori Secara Rekursif

  3. Dapatkan Ukuran Semua Folder di Direktori