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.

użytkownik394
źródło
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ę.

nieznany użytkownik
źródło
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.

Gilles „SO- przestań być zły”
źródło
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

Baronizowany
źródło
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

JJones
źródło