У меня есть такое дерево каталогов
c:\work\src\A\D1\foo.txt
c:\work\src\A\D2\foo.txt
c:\work\src\B\foo.txt
Я хочу запустить редактор потоков (sed) для каждого файла foo.txt и заменить текст на sed. Место назначения будет выглядеть так:
c:\work\dst\A\D1\foo.txt
c:\work\dst\A\D2\foo.txt
c:\work\dst\B\foo.txt
Я попытался найти все foot.txt с помощью команды for командного процессора Windows, но я не знаю, как получить часть из базовой директории:
cd c:\work\src
FOR /R %d in (sources) DO sed %d > c:\work\dst\%d
Это не работает, так как% d расширяется до c:\work\src\A\D1\foo.txt
вместо A\D1\foo.txt
.
Как я могу перебрать все файлы и правильно построить целевой путь?
редактировать
Я использую sed, и я мог бы использовать его и для путей. Я мог бы сохранить имена путей в файле, чтобы позволить sed исправлять их:
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
У этого подхода есть недостаток, заключающийся в том, что текущий каталог не может быть получен из %CD%
но должен быть жестко запрограммирован, так как sed требует экранированной обратной косой черты. Далее я должен бороться с временными файлами тоже. Есть ли более элегантный способ, как
FOR /R "c:\work\src" /D %%d IN (foo.txt) DO @if exist %%d sed ????