dizin ağacının tamamını küçük harfli adlarla değiştir


12

Bir web sitesi dönüşümü üzerinde çalışıyorum. Web sunucusundan bağlandıkları ve sunuldukları dosyalar büyük / küçük harfe duyarsızdı. Ancak, linux sistemimdeki sitenin bir dökümünü yaptım ve veri taşımak için komut dosyaları yazıyorum. Sorun, sayfalardaki bağlantı dizeleri ve dosya sistemindeki gerçek sözcük durumu arasındaki duyarlılık sorunlarıyla karşılaşıyorum.

Örneğin, bir sayfanın <a href='/subfolder/PageName.asp'>gerçek dosyadaki gibi bir bağlantısı olabilir /subfolder/pagename.asp. Aynı şekilde resimlerle <img src='spacer_sm.gif'>de olabilir Spacer_Sm.gif.

Benim düşüncem, site indirmesi için tüm dizin ve dosya adlarını küçük harf eşdeğerleriyle değiştirmek. Bunu nasıl yaparım (ve daha iyi bir yol olabilir mi?)

Case-insensitve anahtarları olan unix komutları olsa bile, ben php kullanıyorum, bu yüzden tüm dosya sistemi komutlarında büyük / küçük harfe duyarlılık için seçenekler yok.


2
Benzer bir önceki soruya bakın . Soru biraz daha spesifik olduğu için burada daha basit bir cevap verdim.
Gilles 'SO- kötü olmayı kes'

Yanıtlar:


8

Unix-lezzetinizin bir tane olup olmadığını bilmiyorum rename. Birçok Linux'a sahiptir ve bir depo arıyorsanız perl paketinin bir parçasıdır.

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

Yukarıdaki sürüm

rename -n 

eylemi gerçekten gerçekleştirmez, sadece ne yapıldığını yazdırır. -N'yi gerçek için yapmayı ihmal ediyorsun.


Hangi 'dil' veya regex 'y/[A-Z]/[a-z]/'parçası?
user394

Peki, renamebir perlpaketin parçası olduğundan , sanırım perl, ama desen sedde ve belki AWKde kullanılıyor. Sadece sedsessiz iyi biliyorum . Ben çevirmek yiçin translateya map, ama nereye karakter kökenleri dan bilmiyorum.
kullanıcı bilinmiyor

Perl regex olmalı - Onun cevabında Gilles renamebir perl betiği olduğunu söylüyor .
user394

Evet ve perl'de yazılması gerekmeyen, ancak daha ilginç bir soru olabilecek dosya adlarını değiştirmek için perl normal ifadelerini kullanabilirsiniz.
kullanıcı bilinmiyor

9

zsh

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

Açıklamalar: zmvbir kalıpla eşleşen dosyaları verilen değiştirme metnine göre yeniden adlandırır. seçeneği başlık altındaki her komuta -o-igeçirir (aşağıya bakın). Yedek Metinde, , , vb desende ardışık parantez gruplardır. tüm (alt) * dizinleri yinelemeli olarak ifade eder. Final , parantez içine alınmış bir grup değil, yalnızca dizinlerle eşleşmesi anlamına gelen bir glob niteleyicisidir. küçük harfe dönüştürür .-imv$1$2**(/)${2:l}$2

Perl adını değiştir

Burada Debian ve Ubuntu'nun gönderdiği Perl yeniden adlandırma komut dosyasını kullanıyorum /usr/bin/prename(genellikle de mevcuttur rename). Bash ≥4 veya zsh ile:

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

Diğer mermilerle:

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

Taşınabilir

Tekrarlı:

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

Kullanımı -depthderinden iç içe dizinleri atalarının önce işlenir sağlar.


1

Aşağıdaki dizin yapısında çalışmadı:

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

İşte işe yarayan bir örnek:

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

bVe edeğişkenler hakkında bir açıklama için :

man bash

Ardından aşağıdaki tuş sırasını kullanın: /,,Enterbb


0

Tüm dizinleri bir kerede değiştirmeye çalıştığı için kabul edilen cevap benim için çalışmadı. Stackexchange'te yukarıdaki Gilles'ten çok benzeyen başka bir çözüm buldum: Baramin'den -
/programming/4268591/unix-rename-files-directories-to-uppercase

Buraya kopyaladım:

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

Tr komutunu ie olarak değiştirdim: sed s / cat / dog / g

Herhangi bir teşekkür yukarıdaki bağlantıdan Baramin'e gider.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.