nome do diretório e cd de todos os subdiretórios no diretório usando shell

0

Propósito

Para cada subdiretório no diretório que contém um setup.py , execute pip uninstall -y <directory name> e pip install .

Solução do Windows

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

EDIT: Parece que a desinstalação / reinstalação do pip pode ser feita com:

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

solução Linux

#!/usr/bin/env bash

DIR="${DIR:-$PWD}
VENV="${VENV:-.venv}"
REQUIREMENTS="${REQUIREMENTS:-'requirements.txt'}";

if [ ! -d "$VENV/bin" ]; then
    echo Cannot find "$VENV/bin"
    exit 2;
fi

source "$VENV/bin/activate"

for f in "${DIR[@]}"; do
    if [ -f "$f/setup.py" ]; then
        builtin cd "$f";
        pip uninstall -y "${PWD##*/}";
        if [ -f "$REQUIREMENTS" ]; then
            pip install -r "$REQUIREMENTS"
        fi
        pip install .;
        builtin cd ..;
    fi;
done

Como você pode ver, minha solução Linux é muito mais versátil. Na verdade, minha solução do Windows não funciona.

A solução do Windows é esmagar as seqüências de caracteres para que as coisas não sejam determinísticas entre as execuções. Parece haver alguma expansão de parâmetro estranho acontecendo. Como devo fazer isso no CMD?

    
por A T 26.02.2017 / 13:52

1 resposta

0

Isso parece uma comparação injusta entre um lote mal escrito e um script completo (eu concordo que o cmd.exe é muito mais limitado). Por que você tira os 3 primeiros caracteres do nome da pasta ao desinstalar?

Esse lote pode funcionar:

@Echo off
for /D %%f in (*) do (
  If exist "%f\setup.py" (
    PushD "%%f"
    pip uninstall "%%f"
    pip install .
    PopD
  )
)
    
por 26.02.2017 / 14:39