имя каталога и cd всех подкаталогов в каталоге с использованием оболочки

238
A T

Цель

Для каждого подкаталога в каталоге, который содержит setup.py, запустите pip uninstall -y <directory name>иpip install .

Решение для Windows

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

РЕДАКТИРОВАТЬ: Похоже, что удаление / переустановка pip может быть сделано с:

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

Решение Linux

#!/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 

Как видите, мое решение для Linux гораздо более универсально. На самом деле мое решение для Windows не работает.

Решение для Windows сводит строки, поэтому между прогонами нет ничего детерминированного. Кажется, происходит какое-то странное расширение параметров. Как я должен делать это в CMD?

0
Вы открыты для Powershell? Поиграйте с: `get-childitem -ErrorAction SilentlyContinue -recurse" C: \ folder \ "-filter setup.py | foreach `в качестве отправной точки, если вы? HelpingHand 7 лет назад 0
«Решение для Windows сводит строки в ряд, поэтому между прогонами все не детерминировано». Пожалуйста, объясните, что вы подразумеваете под этим. DavidPostill 7 лет назад 0

1 ответ на вопрос

0
LotPings

Это выглядит как несправедливое сравнение плохо написанного пакета с одним вкладышем и полноценного bash-скрипта (я согласен, что cmd.exe гораздо более ограничен).
Почему вы удаляете первые 3 символа из имени папки при удалении?

Эта партия может работать:

@Echo off for /D %%f in (*) do ( If exist "%f\setup.py" ( PushD "%%f" pip uninstall "%%f" pip install . PopD ) ) 
Я раздеваюсь, потому что получаю `. /`; и это несправедливое преимущество, потому что Windows - очень WiP. - Спасибо, я дам тебе шанс. A T 7 лет назад 0
Поскольку `for / d` работает по текущему пути, нет необходимости использовать`. \ * `И только с` * `ничего не ставится перед именем папки. Преобразование из одной строки я также пропустил, чтобы удвоить знаки процента. Изменено выше. LotPings 7 лет назад 1
Спасибо: я сделаю это. Кстати: `PushD` /` PopD`; правильно делает `cd`? A T 7 лет назад 0
Да, pusd помещает текущее местоположение в стек и переходит в новую папку. Popd возвращается в предыдущую папку. LotPings 7 лет назад 1