ubah seluruh pohon direktori ke nama huruf kecil


12

Saya sedang mengerjakan konversi situs web. File-file saat mereka ditautkan dan disajikan dari server web tidak peka huruf besar-kecil. Tapi, saya sudah membuat dump situs di sistem linux saya dan saya menulis skrip untuk memigrasikan data. Masalahnya adalah bahwa saya mengalami masalah sensitivitas case antara string tautan di halaman dan case word aktual pada sistem file.

Misalnya, halaman mungkin memiliki tautan seperti <a href='/subfolder/PageName.asp'>saat file yang sebenarnya berada /subfolder/pagename.asp. Begitu juga dengan gambar - <img src='spacer_sm.gif'>mungkin Spacer_Sm.gif.

Jadi pemikiran saya adalah mengubah semua direktori dan nama file menjadi setara dengan huruf kecil untuk unduhan situs. Bagaimana saya melakukan ini (dan mungkin ada cara yang lebih baik?)

Bahkan jika ada perintah unix yang memiliki saklar case-insensitve, saya menggunakan php, jadi tidak semua perintah filesystem di sana memiliki opsi untuk sensitivitas case.


2
Lihat pertanyaan sebelumnya yang serupa . Saya telah mem-posting ulang jawaban yang lebih sederhana di sini karena pertanyaannya sedikit lebih spesifik.
Gilles 'SO- stop being evil'

Jawaban:


8

Saya tidak tahu apakah rasa unix Anda memiliki rename. Banyak Linux memiliki, dan itu adalah bagian dari paket perl, jika Anda mencari repositori.

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"

Versi di atas dengan

rename -n 

tidak benar-benar melakukan tindakan, tetapi hanya mencetak apa yang akan dilakukan. Anda menghilangkan -n untuk melakukannya secara nyata.


'Bahasa' atau regex apa yang menjadi 'y/[A-Z]/[a-z]/'bagiannya?
user394

Ya, karena renameini adalah bagian dari perlpaket, saya kira perl, tetapi polanya digunakan sedjuga, dan mungkin AWKjuga. Saya hanya tahu dengan sedtenang. Saya menerjemahkan yke translateatau map, tetapi saya tidak tahu dari mana karakter itu berasal.
pengguna tidak diketahui

Harus perl regex - Gilles dalam jawabannya mengatakan renameadalah skrip perl.
user394

Ya, dan Anda dapat menggunakan perl regexs, untuk memodifikasi nama file, yang tidak selalu berarti tidak ditulis dalam perl, tetapi yang mungkin pertanyaan yang lebih menarik.
pengguna tidak diketahui

9

Zsh

zmv -o-i '(**/)(*)' '$1${2:l}'

Penjelasan: zmvmengganti nama file yang cocok dengan pola sesuai dengan teks pengganti yang diberikan. -o-imelewati -iopsi untuk setiap mvperintah di bawah tenda (lihat di bawah). Dalam teks pengganti, $1, $2, dll, adalah kelompok kurung berturut-turut dalam pola. **berarti semua (sub) * direktori, secara rekursif. Final (/)bukan grup kurung tetapi kualifikasi global yang berarti hanya cocok dengan direktori. ${2:l}dikonversi $2ke huruf kecil.

Perl mengganti nama

Di sini saya menggunakan skrip rename Perl yang dikirimkan oleh Debian dan Ubuntu /usr/bin/prename(biasanya juga tersedia rename). Dengan bash ≥4 atau zsh:

shopt -s globstar  # only in bash
rename 's!/([^/]*/?)$!\L/$1!' **/*

Dengan kerang lain:

find . -depth -exec rename -n 's!/([^/]*/?)$!\L/$1!' {} +

Portable

Secara rekursif:

find . -depth -exec sh -c '
    t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
    [ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;

Penggunaan -depthmemastikan bahwa direktori yang sangat bersarang diproses sebelum leluhur mereka.


1

Itu tidak berfungsi pada struktur direktori berikut:

JKL/
deF/
ABC/DEf
ABC/gHi
ghi/jkL

Berikut ini contoh yang berfungsi:

for i in `find | sort -r | sed '$d'`; do \
   b=${i%/*}; e=${i##*/}; mv $i $b'/'${e,,}; done

Untuk penjelasan bdan evars:

man bash

Kemudian gunakan urutan tombol berikut: /,,Enterbb


0

Jawaban yang diterima tidak berhasil bagi saya karena mencoba mengubah semua direktori sekaligus. Saya menemukan solusi lain pada stackexchange yang sangat mirip dengan yang portabel dari Gilles di atas: dari Baramin -
/programming/4268591/unix-rename-files-directories-to-uppercase

Saya sudah menyalinnya di sini:

find . -depth | \
while read LONG; do
   SHORT=$( basename "$LONG" | tr '[:lower:]' '[:upper:]' )
   DIR=$( dirname "$LONG" )
   if [ "${LONG}" != "${DIR}/${SHORT}"  ]; then
     mv "${LONG}" "${DIR}/${SHORT}"
   fi
done

Saya mengubah perintah tr yaitu: sed s / cat / dog / g

Terima kasih kepada Baramin di tautan di atas.ie

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.