将特定年龄段内的文件夹和文件移动到另一个目录

时间:2017-02-21 15:32:10

标签: windows for-loop cmd

我有一个非常大的目录,并希望将比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不是一种选择。

1 个答案:

答案 0 :(得分:3)

forfiles/C选项之后执行命令行,当前迭代的目录作为工作目录。 /S选项也是如此。

引用@file返回纯(引用)文件名;引用@relpath返回相对于给定根的路径(在/P选项后面,默认为当前目录。)

所以你可以尝试这样的事情(注意cmd /C需要cmd前缀 - moveechoif等内部命令;大写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)"