批量如何移动隐藏目录?
Batch how to move hidden directories?
我在批处理脚本 (.bat) 中使用以下脚本行将目录 (foo) 的内容复制到另一个目录 (bar):
move "C:\foo\*.*" "C:\bar\"
for /d %%a in ("C:\foo\*") do move "%%~fa" "C:\bar\"
第一行移动文件,第二行移动文件夹。但是,这些并没有移动隐藏目录。 .git
是一个常见的例子。我尝试了 for /d %%a in ("C:\foo\.*") do move "%%~fa" "C:\bar\"
但没有成功。
如何将隐藏目录与其余文件和目录一起移动?
编辑:以下解决方案非常接近于执行所需的操作,但失败了,因为 "move" 命令找不到隐藏的文件夹(在未隐藏的 .folder 上尝试了相同的操作,并且它有效):
for /f "tokens=*" %%G in ('dir /b /a:hd "C:\foo\*"') do move "C:\foo\%%G" "C:\bar\"
对于您要执行的操作,您可以在移动内容之前先使用 attrib
命令以从文件中删除隐藏属性。您可以使用它来实现您的目标:
attrib -h "C:\Program Files\Git\usr\tmp\*.*"
move "C:\Program Files\Git\usr\tmp\*.*" "C:\Program Files\Git\usr\bin\"
要对其他事物执行此操作,您可以这样做:
attrib -h "<SourceParentFolder>\*.*"
move <source> <destination>
注意事项:您应该注意@Mark 的评论。使用 C:\file\path\folder\*
是不正确的。你应该使用 C:\file\path\folder\*.*
。更多信息查看
有关 attrib
的更多信息,请使用 attrib /?
或查看 this
以.
开头的文件或目录名称并不意味着它是隐藏的。
无论如何,for
/for /D
iterates over non-hidden files/directories. However, dir
allows to return hidden items as well when using its /A
option, which can be made use of by using for /F
:
rem // Change into source directory:
pushd "C:\Program Files\Git\usr\tmp" && (
rem // Iterate over all directories, even hidden and system ones:
for /F "delims= eol=|" %%I in ('dir /B /A:D-S-L ".*"') do (
rem // Actually move the directory:
move "%%I" "C:\Program Files\Git\usr\bin\"
)
rem // Return from source directory:
popd
)
经过一些额外的研究,我发现 robocopy 似乎默认包含在 Windows 10 个发行版中,并且 robocopy /MOVE
允许在一行中移动所有需要的文件和文件夹,例如:
robocopy "C:\foo" "C:\bar" /E /MOVE
可以添加其他日志记录选项以减少命令行的输出。
我在批处理脚本 (.bat) 中使用以下脚本行将目录 (foo) 的内容复制到另一个目录 (bar):
move "C:\foo\*.*" "C:\bar\"
for /d %%a in ("C:\foo\*") do move "%%~fa" "C:\bar\"
第一行移动文件,第二行移动文件夹。但是,这些并没有移动隐藏目录。 .git
是一个常见的例子。我尝试了 for /d %%a in ("C:\foo\.*") do move "%%~fa" "C:\bar\"
但没有成功。
如何将隐藏目录与其余文件和目录一起移动?
编辑:以下解决方案非常接近于执行所需的操作,但失败了,因为 "move" 命令找不到隐藏的文件夹(在未隐藏的 .folder 上尝试了相同的操作,并且它有效):
for /f "tokens=*" %%G in ('dir /b /a:hd "C:\foo\*"') do move "C:\foo\%%G" "C:\bar\"
对于您要执行的操作,您可以在移动内容之前先使用 attrib
命令以从文件中删除隐藏属性。您可以使用它来实现您的目标:
attrib -h "C:\Program Files\Git\usr\tmp\*.*"
move "C:\Program Files\Git\usr\tmp\*.*" "C:\Program Files\Git\usr\bin\"
要对其他事物执行此操作,您可以这样做:
attrib -h "<SourceParentFolder>\*.*"
move <source> <destination>
注意事项:您应该注意@Mark 的评论。使用 C:\file\path\folder\*
是不正确的。你应该使用 C:\file\path\folder\*.*
。更多信息查看
有关 attrib
的更多信息,请使用 attrib /?
或查看 this
以.
开头的文件或目录名称并不意味着它是隐藏的。
无论如何,for
/for /D
iterates over non-hidden files/directories. However, dir
allows to return hidden items as well when using its /A
option, which can be made use of by using for /F
:
rem // Change into source directory:
pushd "C:\Program Files\Git\usr\tmp" && (
rem // Iterate over all directories, even hidden and system ones:
for /F "delims= eol=|" %%I in ('dir /B /A:D-S-L ".*"') do (
rem // Actually move the directory:
move "%%I" "C:\Program Files\Git\usr\bin\"
)
rem // Return from source directory:
popd
)
经过一些额外的研究,我发现 robocopy 似乎默认包含在 Windows 10 个发行版中,并且 robocopy /MOVE
允许在一行中移动所有需要的文件和文件夹,例如:
robocopy "C:\foo" "C:\bar" /E /MOVE
可以添加其他日志记录选项以减少命令行的输出。