Ändern Sie den gesamten Verzeichnisbaum in Kleinbuchstaben

11

Ich arbeite an einer Website-Konvertierung. Bei den Dateien, die verknüpft und vom Webserver bereitgestellt wurden, wurde die Groß- und Kleinschreibung nicht berücksichtigt. Aber ich habe einen Dump der Site auf meinem Linux-System erstellt und schreibe Skripte, um Daten zu migrieren. Das Problem ist, dass zwischen Linkzeichenfolgen auf den Seiten und der tatsächlichen Groß- und Kleinschreibung im Dateisystem Probleme mit der Groß- und Kleinschreibung auftreten.

Beispielsweise kann eine Seite einen Link haben, wie es <a href='/subfolder/PageName.asp'>die eigentliche Datei ist /subfolder/pagename.asp. Ebenso bei Bildern - <img src='spacer_sm.gif'>könnte sein Spacer_Sm.gif.

Mein Gedanke ist also, alle Verzeichnisse und Dateinamen für den Site-Download in Kleinbuchstaben zu ändern. Wie mache ich das (und könnte es einen besseren Weg geben?)

Selbst wenn es Unix-Befehle gibt, bei denen zwischen Groß- und Kleinschreibung unterschieden wird, verwende ich PHP, sodass nicht alle dortigen Dateisystembefehle Optionen für die Groß- und Kleinschreibung enthalten.

user394
quelle
2
Siehe eine ähnliche vorherige Frage . Ich habe hier eine einfachere Antwort erneut veröffentlicht, da die Frage etwas spezifischer ist.
Gilles 'SO - hör auf böse zu sein'

Antworten:

8

Ich weiß nicht, ob dein Unix-Geschmack einen hat rename. Viele Linuxes haben und es ist Teil eines Perl-Pakets, wenn Sie nach einem Repository suchen.

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

Oben Version mit

rename -n 

führt die Aktion nicht wirklich aus, sondern druckt nur das aus, was getan werden würde. Sie lassen das -n weg, um es wirklich zu tun.

Benutzer unbekannt
quelle
Welche 'Sprache' oder Regex ist der 'y/[A-Z]/[a-z]/'Teil?
user394
Nun, da renamees Teil eines perlPakets ist, denke ich, Perl, aber das Muster wird auch in sedund vielleicht auch in verwendet AWK. Ich weiß es nur ganz sedgut. Ich übersetze ynach translateoder map, aber ich weiß nicht, woher der Charakter stammt.
Benutzer unbekannt
Muss Perl Regex sein - Gilles sagt in seiner Antwort, dass renamees sich um ein Perl-Skript handelt.
user394
Ja, und Sie können Perl-Regexs verwenden, um die Dateinamen zu ändern, was nicht unbedingt aus dem Schreiben in Perl resultiert, aber möglicherweise die interessantere Frage ist.
Benutzer unbekannt
8

Zsh

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

Erläuterungen: zmvBenennt Dateien um, die einem Muster entsprechen, gemäß dem angegebenen Ersatztext um. -o-iÜbergibt die -iOption an jeden mvBefehl unter der Haube (siehe unten). Im Ersetzungstext, $1, $2, usw., sind die aufeinanderfolgenden klammerten Gruppen in dem Muster. **bedeutet alle (Unter-) * Verzeichnisse rekursiv. Das Finale (/)ist keine Gruppe in Klammern, sondern ein Glob-Qualifikationsmerkmal, das bedeutet, dass nur Verzeichnisse übereinstimmen. ${2:l}konvertiert $2in Kleinbuchstaben.

Perl umbenennen

Hier verwende ich das Perl-Umbenennungsskript, als das Debian und Ubuntu ausgeliefert werden /usr/bin/prename(normalerweise auch verfügbar rename). Mit Bash ≥4 oder zsh:

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

Mit anderen Muscheln:

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

tragbar

Rekursiv:

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

Die Verwendung von -depthstellt sicher, dass tief verschachtelte Verzeichnisse vor ihren Vorfahren verarbeitet werden.

Gilles 'SO - hör auf böse zu sein'
quelle
1

Bei der folgenden Verzeichnisstruktur hat es nicht funktioniert:

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

Hier ist ein Beispiel, das funktioniert:

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

Für eine Erklärung zu bund evars:

man bash

Verwenden Sie dann die folgende Tastenfolge: /,,Enterbb

Baronsed
quelle
0

Die akzeptierte Antwort funktionierte bei mir nicht, da versucht wurde, alle Verzeichnisse gleichzeitig zu ändern. Ich habe bei Stackexchange eine andere Lösung gefunden, die der tragbaren von Gilles oben sehr ähnlich ist: von Baramin -
/programming/4268591/unix-rename-files-directories-to-uppercase

Ich habe es hier kopiert:

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

Zu dem ich den Befehl tr in ie geändert habe: sed s / cat / dog / g

Jeder Dank geht an Baramin unter dem obigen Link

JJones
quelle