obtém parte do caminho em operação recursiva

0

Eu tenho uma árvore de diretórios como esta

c:\work\src\A\D1\foo.txt
c:\work\src\A\D2\foo.txt
c:\work\src\B\foo.txt

Eu quero rodar o editor de stream (sed) para cada foo.txt e substituir algum texto por sed. O destino seria assim:

c:\work\dst\A\D1\foo.txt
c:\work\dst\A\D2\foo.txt
c:\work\dst\B\foo.txt

Eu tentei encontrar todo o foot.txt com o comando for do processador de comandos do windows, mas não sei como obter a parte do diretório base:

cd c:\work\src
FOR /R %d in (sources) DO sed %d > c:\work\dst\%d

Isso não funciona, já que% d se expande para c:\work\src\A\D1\foo.txt em vez de A\D1\foo.txt .

Como posso iterar todos os arquivos e construir o caminho de destino adequadamente?

editar

Eu uso o sed e também posso usá-lo para os nomes dos caminhos. Eu poderia armazenar os nomes dos caminhos em um arquivo para permitir que o sed os corrigisse:

set dst=c:\work\dst\
del /f foo.tmp
FOR /R %%d in (.) DO @echo %%d >> foo.tmp
sed s/C:\work\src\// foo.tmp > bah.tmp
FOR /F IN (bah.tmp) DO sed -f patch.sed %%i > %dst%\%%i
del foo.tmp bah.tmp

Essa abordagem tem a desvantagem de que o diretório atual não pode ser obtido de %CD% , mas tem que ser codificado, pois sed requer barras invertidas com escape. Além disso eu tenho que lutar com os arquivos temporários também. Existe uma maneira mais elegante como

FOR /R "c:\work\src" /D %%d IN (foo.txt) DO @if exist %%d  sed ????
    
por harper 13.02.2014 / 16:06

2 respostas

0

O mesmo conceito do script de Kevin. Apenas um pouco mais curto. : -)

@echo off
::Get the directory from whence the script was called
set CWD=%~dp0
set CWD
for /R %%g in (foo.txt) do (if exist "%%g" call :GetPath "%%g")
goto :exit  

:GetPath
if not exist "%~1" goto :EOF
echo Original: %~1
set _nfile=%~1
call set _nfile=%%_nfile:%CWD%=%%
echo NFile: %_nfile%
goto :EOF

:exit
set CWD=
set _nfile=

Adicione seu comando SED na rotina "GetPath" e passe a variável _nfile .

    
por 13.02.2014 / 21:59
0

OK, eu configurei o mesmo conjunto de arquivos de teste:

X:\>dir /s /b
X:\work
X:\work\src
X:\work\src\A
X:\work\src\B
X:\work\src\A\D1
X:\work\src\A\D2
X:\work\src\A\D1\foo.txt
X:\work\src\A\D2\foo.txt
X:\work\src\B\foo.txt

Então, eu tenho um arquivo de lote. Digamos que ele seja salvo como: "D:\batchscript.cmd" :

@echo off

rem get the "unique" part of the source and dest paths: "\src\", "\dst\"
set "zusource=\src\"
set "zudest=\dst\"



rem From within the current directory, and all subdirectories,
rem process each file named "foo.txt"
for /f "usebackq delims=" %%f in ('dir /s /b "foo.txt"') do call :work "%%~f"

rem We are done. Go "exit" the script.
goto :EOF



:work
rem get the full name of the current "source" file: "X:\work\src\A\D1\foo.txt"
set "zsourcefq=%~1"



rem substitute the "unique" parts:
rem get "X:\work\dst\A\D1\foo.txt" from "X:\work\src\A\D1\foo.txt"
for /f "usebackq delims=" %%g in ('echo set "zdestfq=%%zsourcefq:%zusource%=%zudest%%%"') do %%g



rem make the destination directory if necessaary: "X:\work\dst\A\D1"
rem two ways, first relies on your specific file "name", second is "universal"

rem md "%zdestfq:foo.txt=%" 2>nul
for %%g in ("%zdestfq%") do md "%%~dpg" 2>nul



echo Processing: "%zsourcefq%" --^> "%zdestfq%"

rem do your "sed" command here
echo     sed -r "s/whatever/whateverelse/g" "%zsourcefq%" ^> "%zdestfq%"

goto :EOF

Para usar o scirpt, primeiro mude para o diretório "source":

X:\>CD /D "X:\work\src"
X:\work\src>

Em seguida, execute o script:

X:\work\src>"D:\batchscript.cmd"
Processing: "X:\work\src\A\D1\foo.txt" --> "X:\work\dst\A\D1\foo.txt"
    sed -r "s/whatever/whateverelse/g" "X:\work\src\A\D1\foo.txt" > "X:\work\dst\A\D1\foo.txt"
Processing: "X:\work\src\A\D2\foo.txt" --> "X:\work\dst\A\D2\foo.txt"
    sed -r "s/whatever/whateverelse/g" "X:\work\src\A\D2\foo.txt" > "X:\work\dst\A\D2\foo.txt"
Processing: "X:\work\src\B\foo.txt" --> "X:\work\dst\B\foo.txt"
    sed -r "s/whatever/whateverelse/g" "X:\work\src\B\foo.txt" > "X:\work\dst\B\foo.txt"

Altere a linha que começa: "echo sed -r..." para qualquer comando sed que você precisar.

    
por 13.02.2014 / 21:00