【问题标题】:Commands to move folders and files within of a certain age to another Directory将特定期限内的文件夹和文件移动到另一个目录的命令
【发布时间】:2017-02-21 15:32:10
【问题描述】:

我有一个很大的目录,我想将比 90 天更早的文件夹/文件移动到另一个目录。

我的出发点是这个cmd命令

forfiles /s /m *.* /d -90 /c "cmd /c echo @file is at least 90 days old."

这将返回超过 90 天的文件,但我需要将 echo 替换为 move 命令。我不确定这将如何使文件与其父目录保持原样。

这样可以保持文件夹结构吗?

forfiles /s /m *.* /d -90 /c "move @file c:\temp"

在尝试这样做时,有人有什么建议或预见到任何问题吗?

Robocopy 不是一种选择。

【问题讨论】:

标签: windows for-loop cmd


【解决方案1】:

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

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

所以你可以尝试这样的事情(注意cmd 需要cmd /C 前缀-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 循环只是在%~F 访问时从@relpath 检索到的路径中删除周围的引号;如果您在批处理文件中使用代码,请确保将 % 符号加倍!
  • mkdir创建当前迭代项的父目录; 2> nul在目录已经存在的情况下隐藏错误信息;
  • move 前面有 ECHO 用于测试目的;删除它以实际移动文件;

如果您想覆盖目标位置的文件,只需将/Y 选项添加到move


以下命令行可能也适用于示例路径,但如果目标路径包含 SPACEs 或其他有毒字符,它肯定会失败,因为引号没有正确处理:

forfiles /S /C "cmd /C if @isdir==FALSE (2> nul mkdir C:\temp\@relpath\.. & ECHO move @relpath C:\temp\@relpath)"

【讨论】:

  • 漂亮的答案,关于这个命令(抱歉,我不知道如何像你上面那样格式化它) forfiles /S /D -90 /C "cmd /C if @isdir== FALSE(对于 (@relpath) 中的 %F 执行 @(2> nul mkdir 0x22C:\temp\%~F\..0x22 & ECHO move @relpath 0x22C:\temp\%~F0x22))" 这会起作用吗是否有包含文件的子目录的子目录?在我的情况下,我可以根据自己的创建日期移动顶级文件夹,这会更容易吗?
  • 是的;有/S 开关告诉forfiles 也枚举子目录;即使子目录本身可能与过滤器不匹配(/D/M),如果匹配,仍会返回任何包含的子项。注意forfiles /D不关心创建日期,它只关心文件和目录的最后修改日期......
  • 谷歌搜索我发现没有任何开关在文件/文件夹的创建日期上运行。我相信这个命令会删除一个早于 90 的文件夹,但又是因为 /D 它是基于修改日期的。 forfiles /p "c:/temp" /s /m . /c "cmd /c Del @path" /d -90 问题是有人可以在 89 天修改文件,脚本会然后移动所有内容,但该文件可能会造成很大的混乱。也许这不是尝试执行此操作的最佳方法,因为以创建日期为基础的顶级目录将是最好的方法,我不确定我可以。
  • @Krom 您希望知道,当目录或文件第一次在 中创建时,文件/目录的创建日期始终设置为 当前日期目录。因此,如果您将 2 年前最后修改的文件从一个目录复制到另一个目录,则目标文件的最后修改日期与源目录中的源文件的最后修改日期相同,但其创建日期是当前日期。这意味着目标目录中文件的创建日期是文件最后修改日期之后的 2 年。出于这个原因,创建日期几乎从未被使用,因为它没有真正的用处。
  • @Krom 换句话说,文件的创建日期提供了关于文件在 该目录 中已经存在多长时间而不被临时删除的信息,而不是文件的年龄文件内容第一次保存的时间。
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2019-06-20
  • 2017-05-04
  • 1970-01-01
相关资源
最近更新 更多