在路径的每个子文件夹中运行命令的最简单方法是什么?在这种情况下,我必须为我的存储库中的每个目录运行svn cleanup。
答案 0 :(得分:7)
for
命令就是你要找的。为了阅读确切的语法类型for /?
例如,为了打印当前目录中所有子目录的名称。您可以使用命令:
for /d /r %i in (*.*) do @echo %i
echo%i部分是您必须根据自己的情况更改的部分。
答案 1 :(得分:3)
我发现在这种情况下,删除工作副本和重新结账更容易。如果您有本地更改,请先将更改的文件复制到其他位置。
但是Can's answer可能适用于你的情况,除非SVN有更大的问题。虽然你可能需要多次运行它,因为它会从仍然有问题的根文件夹开始,然后。在这种情况下,您需要某种后序遍历,这不能用for /r
完成,但可以确保您从层次结构中的最低目录开始清理。
您还需要排除SVN的状态目录.svn:
for /r /d %i in (*) do if NOT %i==.svn svn cleanup %i
对于订单后遍历,您可以构建一个小批量:
@echo off
call :recurse "."
goto :eof
:recurse
pushd %1
if not %~1==.svn (
for /d %%i in (*) do call :recurse "%%i"
echo svn cleanup %~1
)
popd
goto :eof
在以下树上:
a ├───.svn ├───a1 │ └───.svn └───a2 └───.svn b ├───.svn ├───b1 │ ├───.svn │ ├───b11 │ │ └───.svn │ └───b12 │ └───.svn └───b2
这会产生以下输出:
svn cleanup "a1" svn cleanup "a2" svn cleanup "a" svn cleanup "b11" svn cleanup "b12" svn cleanup "b1" svn cleanup "b2" svn cleanup "b" svn cleanup "."
,正如您所看到的,确保首先处理最低目录并跳过.svn目录。如果要使用它,请删除echo
。这可以解决您的问题。也许
答案 2 :(得分:1)
svn cleanup
会自动递归到子目录中。我不确定为什么你需要手动递归该特定命令。
答案 3 :(得分:1)
如another answer中所述,for /R
command有帮助:
for /D /R %I in ("*") do @echo "%~I"
要明确指定根目录,请执行以下操作:
for /D /R "D:\Root" %I in ("*") do @echo "%~I"
dir
command和for /F
可以达到相同的目的:
for /F "delims=" %I in ('dir /S /B /A:D "D:\Root\*"') do @echo "%~I"
此命令行以及上述命令行从上至下遍历目录树。要扭转这种情况,只需合并sort
command:
for /F "delims=" %I in ('dir /S /B /A:D "D:\Root\*" ^| sort /R') do @echo "%~I"
以上所有内容均不包含根目录。要包含它,请使用以下代码:
for /F "delims=" %J in ('^(for /R "D:\Root" %I in ^(.^) do @echo "%~fI"^)') do @echo "%~J"
要再次从下到上颠倒顺序,请使用以下命令:
for /F "delims=" %J in ('^(for /R "D:\Root" %I in ^(.^) do @echo "%~fI"^^^& rem/^) ^| sort /R') do @echo "%~J"