将文件夹和子文件夹中的某些文件全部移动到单独的单个文件夹中的批处理命令
batch command that moves certain files within folder and sub folders all to a separate single folder
我有一个批处理命令,可以将某些文件从一个文件夹移动到另一个文件夹,如下所示:
move /-y "U:\REVIT\REVIT FAMILES\*.00*.rfa" "U:\REVIT\Revit Backup Files"
pause
这会将已创建且扩展名为 .001.rfa
、.002.rfa
等的备份文件移动到另一个文件夹,但它只会移动该特定文件夹中的文件,而不会从子文件夹也存在。谁能帮忙添加这个功能?
我认为你可以通过以下方式实现你想要的:
for /f %i in ('dir /s /b "REVIT FAMILES*.00*.rfa"') do move /-Y "%i" "U:\REVIT\Revit Backup Files\"
保留目录层次结构
如果您想保留目录层次结构,可以执行以下操作:
robocopy "U:\REVIT\REVIT FAMILES" "U:\REVIT\Revit Backup Files" "*.00*.rfa" /S /MOV /XC /XN /XO
/XC /XN /XO
选项防止覆盖。请注意,没有提示。删除它们以强制覆盖已经存在的目标文件。
或者,您可以使用 xcopy
和 del
:
xcopy /Y /S /I "U:\REVIT\REVIT FAMILES\*.00*.rfa" "U:\REVIT\Revit Backup Files"
del /S "U:\REVIT\REVIT FAMILES\*.00*.rfa"
/Y
选项强制覆盖已经存在的目标文件。当您将其更改为 /-Y
以实现提示时,del
不关心选择并仍然删除所有匹配的源文件。
最后,第三个选择是使用 for
循环:
set "TARGET=U:\REVIT\Revit Backup Files"
pushd "U:\REVIT\REVIT FAMILES"
for /F "tokens=2 delims=:" %%F in ('xcopy /L /S /Y /I "*.00*.rfa" "%TARGET%"') do (
2> nul md "%TARGET%\%%F\.."
move /-Y "%%F" "%TARGET%\%%F"
)
popd
xcopy /L
只是将建议的文件列为相对于源目录的路径,但实际上并没有复制(由于 /L
)。每个迭代文件都由 move
命令移动; /-Y
在目标文件已经存在的情况下强制提示。 md
命令需要在目标目录中创建每个子目录,2> nul
抑制错误消息,以防已经存在。
不保留目录层次结构
再次需要一个 for
循环,但这次 dir /B /S
替换 xcopy /L
:
for /F "tokens=2 delims=:" %%F in ('dir /B /S /A:-D "U:\REVIT\REVIT FAMILES\*.00*.rfa"') do (
move /-Y "%%F" "U:\REVIT\Revit Backup Files\%%~nxF"
)
~nx
修饰符从 %%F
.
中的路径中提取纯文件名(基本名称加扩展名)
我有一个批处理命令,可以将某些文件从一个文件夹移动到另一个文件夹,如下所示:
move /-y "U:\REVIT\REVIT FAMILES\*.00*.rfa" "U:\REVIT\Revit Backup Files"
pause
这会将已创建且扩展名为 .001.rfa
、.002.rfa
等的备份文件移动到另一个文件夹,但它只会移动该特定文件夹中的文件,而不会从子文件夹也存在。谁能帮忙添加这个功能?
我认为你可以通过以下方式实现你想要的:
for /f %i in ('dir /s /b "REVIT FAMILES*.00*.rfa"') do move /-Y "%i" "U:\REVIT\Revit Backup Files\"
保留目录层次结构
如果您想保留目录层次结构,可以执行以下操作:
robocopy "U:\REVIT\REVIT FAMILES" "U:\REVIT\Revit Backup Files" "*.00*.rfa" /S /MOV /XC /XN /XO
/XC /XN /XO
选项防止覆盖。请注意,没有提示。删除它们以强制覆盖已经存在的目标文件。
或者,您可以使用 xcopy
和 del
:
xcopy /Y /S /I "U:\REVIT\REVIT FAMILES\*.00*.rfa" "U:\REVIT\Revit Backup Files"
del /S "U:\REVIT\REVIT FAMILES\*.00*.rfa"
/Y
选项强制覆盖已经存在的目标文件。当您将其更改为 /-Y
以实现提示时,del
不关心选择并仍然删除所有匹配的源文件。
最后,第三个选择是使用 for
循环:
set "TARGET=U:\REVIT\Revit Backup Files"
pushd "U:\REVIT\REVIT FAMILES"
for /F "tokens=2 delims=:" %%F in ('xcopy /L /S /Y /I "*.00*.rfa" "%TARGET%"') do (
2> nul md "%TARGET%\%%F\.."
move /-Y "%%F" "%TARGET%\%%F"
)
popd
xcopy /L
只是将建议的文件列为相对于源目录的路径,但实际上并没有复制(由于 /L
)。每个迭代文件都由 move
命令移动; /-Y
在目标文件已经存在的情况下强制提示。 md
命令需要在目标目录中创建每个子目录,2> nul
抑制错误消息,以防已经存在。
不保留目录层次结构
再次需要一个 for
循环,但这次 dir /B /S
替换 xcopy /L
:
for /F "tokens=2 delims=:" %%F in ('dir /B /S /A:-D "U:\REVIT\REVIT FAMILES\*.00*.rfa"') do (
move /-Y "%%F" "U:\REVIT\Revit Backup Files\%%~nxF"
)
~nx
修饰符从 %%F
.