zmień całe drzewo katalogów na małe litery


12

Pracuję nad konwersją strony internetowej. Pliki, które zostały połączone i dostarczone z serwera WWW, nie rozróżniają wielkości liter. Ale zrobiłem zrzut strony w moim systemie Linux i piszę skrypty do migracji danych. Problem polega na tym, że napotykam problemy z rozróżnianiem wielkości liter między ciągami linków na stronach a rzeczywistą wielkością liter w systemie plików.

Na przykład strona może mieć link taki <a href='/subfolder/PageName.asp'>, jak w rzeczywistości /subfolder/pagename.asp. Podobnie z obrazami - <img src='spacer_sm.gif'>może być Spacer_Sm.gif.

Myślę więc o zmianie wszystkich katalogów i nazw plików na ich małe odpowiedniki do pobrania strony. Jak to zrobić (i czy może być lepszy sposób?)

Nawet jeśli istnieją komendy unix, które mają przełączniki bez rozróżniania wielkości liter, używam php, więc nie wszystkie komendy systemu plików mają opcje rozróżniania wielkości liter.


2
Zobacz podobne poprzednie pytanie . Odpowiedziałem tutaj prostszą odpowiedź, ponieważ pytanie jest nieco bardziej szczegółowe.
Gilles „SO- przestań być zły”

Odpowiedzi:


8

Nie wiem czy twój uniksowy smak ma rename. Wiele Linuksów ma i jest częścią pakietu perla, jeśli szukasz repozytorium.

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

Powyższa wersja z

rename -n 

tak naprawdę nie wykonuje akcji, ale drukuje tylko to, co można zrobić. Pomijasz -n, aby zrobić to naprawdę.


Jaki jest „język” lub wyrażenie regularne 'y/[A-Z]/[a-z]/'?
user394

Cóż, skoro renamejest częścią perlpakietu, to chyba perl, ale wzorzec jest również używany sed, a może AWKtakże. Znam tylko sedciszę. Tłumaczę yna translatelub map, ale nie wiem, skąd pochodzi ta postać.
użytkownik nieznany

Musi to być perl regex - Gilles w swojej odpowiedzi mówi, że renameto skrypt perla.
user394

Tak, możesz użyć wyrażeń regularnych w Perlu, aby zmodyfikować nazwy plików, co niekoniecznie kończy się na napisaniu w Perlu, ale może być bardziej interesującym pytaniem.
użytkownik nieznany

9

Zsh

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

Objaśnienia: zmvzmienia nazwy plików pasujących do wzorca zgodnie z podanym tekstem zastępczym. -o-iprzekazuje -iopcję każdemumv polecenia pod maską (patrz poniżej). W tekście zastępczej $1, $2itd, są kolejne grupy w nawiasach we wzorcu. **oznacza rekursywnie wszystkie (pod) * katalogi. Finał (/)nie jest grupą w nawiasach, ale globalnym kwalifikatorem, który oznacza dopasowanie tylko do katalogów. ${2:l}konwertuje $2na małe litery.

Zmiana nazwy Perla

Tutaj używam skryptu zmiany nazwy Perla, który dostarczają Debian i Ubuntu /usr/bin/prename (zwykle również dostępny rename). Z uderzeniem ≥4 lub zsh:

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

Z innymi pociskami:

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

Przenośny

Rekurencyjnie:

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

Zastosowanie -depthzapewnia, że ​​głęboko zagnieżdżone katalogi są przetwarzane przed ich przodkami.


1

Nie działało w następującej strukturze katalogów:

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

Oto przykład, który działa:

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

Aby uzyskać wyjaśnienie bi ezmienne:

man bash

Następnie użyj następującej sekwencji klawiszy: /,,Enterbb


0

Przyjęta odpowiedź nie działała dla mnie, ponieważ próbowała zmienić wszystkie katalogi naraz. Znalazłem inne rozwiązanie na stackexchange bardzo podobne do przenośnego od Gilles powyżej: od Baramina -
/programming/4268591/unix-rename-files-directories-to-uppercase

Skopiowałem to tutaj:

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

Na które zmieniłem polecenie tr na np .: sed s / cat / dog / g

Wszelkie podziękowania kierowane są do Baramina pod linkiem powyżej

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.