Verzeichnisname und CD aller Unterverzeichnisse in einem Verzeichnis, das Shell verwendet

310
A T

Zweck

setup.pyFühren Sie für jedes Unterverzeichnis in einem Verzeichnis, das ein enthält, ein pip uninstall -y <directory name>und auspip install .

Windows-Lösung

> for /D %f in (.\*) do (cd "%cd%\%f" && set s=%f && set j=%s:~3% && pip uninstall %j% && pip install .) 

BEARBEITEN: Anscheinend kann pip deinstallieren / neu installieren mit:

(for %F in ("%cd%") do pip uninstall -y "%~nxF") & pip install . 

Linux-Lösung

#!/usr/bin/env bash  DIR="$ VENV="$" REQUIREMENTS="$";  if [ ! -d "$VENV/bin" ]; then echo Cannot find "$VENV/bin" exit 2; fi  source "$VENV/bin/activate"  for f in "$"; do if [ -f "$f/setup.py" ]; then builtin cd "$f"; pip uninstall -y "$"; if [ -f "$REQUIREMENTS" ]; then pip install -r "$REQUIREMENTS" fi pip install .; builtin cd ..; fi; done 

Wie Sie sehen, ist meine Linux-Lösung viel vielseitiger. Eigentlich funktioniert meine Windows-Lösung nicht.

Die Windows-Lösung drückt die Zeichenfolgen zusammen, so dass die Dinge zwischen den Läufen nicht deterministisch sind. Scheint eine seltsame Parametererweiterung zu sein. Wie soll ich es in CMD machen?

0
Bist du offen für Powershell? Spielen Sie mit: `get-childitem -ErrorAction SilentlyContinue -recurse" C: \ Ordner \ "-filter setup.py | foreach `als Ausgangspunkt, wenn Sie sind? HelpingHand vor 7 Jahren 0
"Die Windows-Lösung drückt die Zeichenketten zusammen, damit die Dinge nicht zwischen den Läufen deterministisch sind." Bitte erläutern Sie, was Sie damit meinen. DavidPostill vor 7 Jahren 0

1 Antwort auf die Frage

0
LotPings

Das sieht aus wie ein unfairer Vergleich zwischen einem schlecht geschriebenen Batch-One-Liner und einem vollwertigen Bash-Skript (ich bin damit einverstanden, dass cmd.exe wesentlich eingeschränkter ist).
Warum entfernen Sie bei der Deinstallation die ersten 3 Zeichen vom Ordnernamen?

Diese Charge könnte funktionieren:

@Echo off for /D %%f in (*) do ( If exist "%f\setup.py" ( PushD "%%f" pip uninstall "%%f" pip install . PopD ) ) 
Ich strippe, weil ich die `. /`; und es ist ein unfairer Vorteil, weil Windows ein WiP ist. - Danke, ich gebe dir eine Chance. A T vor 7 Jahren 0
Da `for / d` vom aktuellen Pfad abhängt, ist es nicht erforderlich,`. \ * `Zu verwenden, und mit nur * steht dem Ordnernamen nichts voran. Beim Konvertieren von einer Zeile habe ich auch versäumt, die Prozentzeichen zu verdoppeln. Oben geändert LotPings vor 7 Jahren 1
Danke: Ich werde das probieren. BTW: Der `PushD` /` PopD`; macht die `cd` richtig? A T vor 7 Jahren 0
Ja, pusd legt den aktuellen Speicherort auf einen Stapel und wechselt in den neuen Ordner. Popd kehrt zum vorherigen Ordner zurück. LotPings vor 7 Jahren 1