[FIXED] git viele Dateien und Ordner umbenennen

Ausgabe

Ich versuche, viele Dateien in meiner Anwendung umzubenennen und muss in der Lage sein, eine Umbenennung in allen Unterverzeichnissen aus dem App-Root durch git (dh git mv %filenamematch% %replacement%) vorzunehmen, die nur den übereinstimmenden Text ersetzt. Ich bin jedoch nicht gut mit Bash-Skripten.

update: wäre gut wenn auch umbenannte Verzeichnisse dazu passen!

Lösung

Das sollte den Trick machen:

for file in $(git ls-files | grep %filenamematch% | sed -e 's/\(%filenamematch%[^/]*\).*/\1/' | uniq); do git mv $file $(echo $file | sed -e 's/%filenamematch%/%replacement%/'); done

Um zu verstehen, was dies tut, müssen Sie das Piping mit “|” verstehen. und Befehlsersetzung durch “$(…)”. Diese leistungsstarken Shell-Konstrukte ermöglichen es uns, mehrere Befehle zu kombinieren, um das gewünschte Ergebnis zu erhalten. Siehe Pipelines und Befehlssubstitution .

Hier ist, was in diesem Einzeiler vor sich geht:

  1. git ls-files: Dies erzeugt eine Liste von Dateien im Git-Repository. Es ähnelt dem, was Sie von bekommen könnten ls, außer dass es nur Git-Projektdateien ausgibt. Ausgehend von dieser Liste wird sichergestellt, dass nichts in Ihrem .git/-Verzeichnis berührt wird.

  2. | grep %filenamematch%: Wir nehmen die Liste aus git ls-filesund leiten sie durch grep, um sie nur auf die Dateinamen zu filtern, die das gesuchte Wort oder Muster enthalten.

  3. | sed -e 's/\(%filenamematch%[^/]*\).*/\1/'Hinweis: Wir leiten diese Übereinstimmungen durch sed (den Stream-Editor) und führen den (Ersatz-)Befehl von (-e) sed aus, um alle / und nachfolgenden Zeichen nach unserem übereinstimmenden Verzeichnis (falls es eines ist) abzuschneiden.

  4. | uniq: In Fällen, in denen die Übereinstimmung ein Verzeichnis ist, könnten jetzt, da wir enthaltene Verzeichnisse und Dateien abgeschnitten haben, viele übereinstimmende Zeilen vorhanden sein. Wir verwenden uniq, um sie alle in einer Zeile zusammenzufassen.

  5. for file in ...: Der “for”-Befehl der Shell durchläuft alle Elemente (Dateinamen) in der Liste. Jeden Dateinamen weist er der Reihe nach der Variablen “$file” zu und führt dann den Befehl nach dem Semikolon (;) aus.

  6. sed -e 's/%filenamematch%/%replacement%/'Hinweis: Wir verwenden echo , um jeden Dateinamen durch sed zu leiten, wobei wir erneut seinen Ersatzbefehl verwenden – diesmal, um unsere Musterersetzung für den Dateinamen durchzuführen.

  7. git mv: Wir verwenden diesen Git-Befehl, um die vorhandene Datei ($file) auf den neuen Dateinamen (den von sed geänderten) zu übertragen.

Eine Möglichkeit, dies besser zu verstehen, wäre, jeden dieser Schritte isoliert zu betrachten. Führen Sie dazu die folgenden Befehle in Ihrer Shell aus und beobachten Sie die Ausgabe. All dies ist nicht destruktiv und erstellt nur Listen für Ihre Beobachtung:

  1. git ls-files

  2. git ls-files | grep %filenamematch%

  3. git ls-files | grep %filenamematch% | sed -e 's/\(%filenamematch%[^/]*\).*/\1/'

  4. git ls-files | grep %filenamematch% | sed -e 's/\(%filenamematch%[^/]*\).*/\1/' | uniq

  5. for file in $(git ls-files | grep %filenamematch% | sed -e 's/\(%filenamematch%[^/]*\).*/\1/' | uniq); do echo $file; erledigt

  6. for file in $(git ls-files | grep %filenamematch% | sed -e 's/\(%filenamematch%[^/]*\).*/\1/' | uniq); do echo $file | sed -e 's/%filenamematch%/%replacement%/'; erledigt


Beantwortet von –
Jonathan Camenisch


Antwort geprüft von –
Pedro (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like