我有一个非常大的目录,并希望将比90天更早的文件夹/文件移动到另一个目录。
我的出发点是这个cmd命令
forfiles /s /m *.* /d -90 /c "cmd /c echo @file is at least 90 days old."
这将返回超过90天的文件,但我需要用move命令替换echo。我不确定这对于将文件完整地保存在父目录中是如何工作的。
这会保留文件夹结构吗?
forfiles /s /m *.* /d -90 /c "move @file c:\temp"
有人会有任何建议或预见到尝试这样做的任何问题吗?
Robocopy不是一种选择。
答案 0 :(得分:3)
forfiles
在/C
选项之后执行命令行,当前迭代的目录作为工作目录。 /S
选项也是如此。
引用@file
返回纯(引用)文件名;引用@relpath
返回相对于给定根的路径(在/P
选项后面,默认为当前目录。)
所以你可以尝试这样的事情(注意cmd /C
需要cmd
前缀 - move
,echo
或if
等内部命令;大写ECHO
只显示将在没有的情况下执行的move
命令行:
forfiles /S /D -90 /C "cmd /C if @isdir==FALSE ECHO move @relpath 0x22C:\temp\0x22"
这会将所有文件移动到目录C:\temp
中,但会丢失原始目录层次结构。 (请注意,if @isdir==FALSE
查询会阻止处理子目录。)
因此我们需要自己构建目标目录,如下所示:
forfiles /S /D -90 /C "cmd /C if @isdir==FALSE (for %F in (@relpath) do @(2> nul mkdir 0x22C:\temp\%~F\..0x22 & ECHO move @relpath 0x22C:\temp\%~F0x22))"
这里会发生什么:
0x22
代表引号"
; if @isdir==FALSE
确保仅处理文件; for
循环只会删除@relpath
访问时%~F
检索到的路径中的周围引号;如果您在批处理文件中使用代码,请确保将%
符号加倍!mkdir
创建当前迭代项的父目录;如果目录已存在,2> nul
会隐藏错误消息; move
前面有ECHO
用于测试目的;删除它以实际移动文件; 如果您要覆盖目标位置的文件,只需将/Y
选项添加到move
。
以下命令行也可能适用于示例路径,但是如果目标路径包含 SPACEs 或其他有毒字符,它肯定会失败,因为报价未正确处理:< / p>
forfiles /S /C "cmd /C if @isdir==FALSE (2> nul mkdir C:\temp\@relpath\.. & ECHO move @relpath C:\temp\@relpath)"