Windows递归触摸命令


17

在Windows 7中,如何递归触摸目录(包括子目录)中的所有文件以更新日期/时间戳?

Windows 7是否具有完成此任务的机制?



该链接中的“可接受”答案是关于使用.NET编程库来完成一个文件。其他是关于添加上下文菜单以更新单个文件。我一直在寻找一个内置命令来递归地处理N个文件。下面的答案适用于所有文件。它不是内置的,但是可以工作。谢谢。
jmq 2011年

它也不是Windows版本的Unix touch命令的副本,因为此问题专门要求递归。但是,请注意,该问题的一些答案具有递归形式。
JdeBP

Answers:


19

有几种可能性:

  • 使用Unix touch命令的端口,并简单地以Unix方式组合findtouch使用。有几种选择。经常提到的是GNUWin32cygwinunxutilsSFUA实用工具包中的工具鲜为人知,但在某些方面却更好,它们在Windows 7 Ultimate Edition和Windows Server 2008 R2的包装盒中的基于UNIX的应用程序子系统中运行。(对于Windows XP,可以下载并安装用于UNIX 3.5版服务)。该工具包有大量的命令行工具TUI,从mvdu通过了Korn和C shell,以perlawk。它具有x86-64和IA64两种版本以及x86-32。这些程序在Windows本机的适当POSIX环境中运行,而不是cygwin1.dll通过Win32 上的仿真器DLL(例如)进行分层。是的,该工具包包含touchfind,以及其他300个。
    当然,所有这些工具箱都有一个众所周知的缺点,就是要为每个要触摸的文件运行单独的进程。以下替代方案不是问题。

  • 使用touch人们编写和发布的许多本机Win32 命令之一。 它们中的许多都支持执行递归的选项,而Unix不需要find环绕它们。(毕竟,它们的目标用户是正在寻找touch命令的用户群,因为它没有负载大量的Unix命令。)StéphaneDuguay就是touch其中之一,您可以看到它有一个--recursive选择。

  • 巧妙掌握CMD的神秘奥秘。 如另一个答案中所述,COPY /B myfile+,,将使用鲜为人知的COPY命令“ plus”语法来更新文件的最后修改日期戳(更多信息,请参见此处)。当然,这可以结合起来FOR /R递归执行操作,如此处另一个答案所暗示的。

  • 使用替换命令解释器,它比CMD更加聪明,更直接。 JP Software的TCC / LE就是这样的一种。它命令中添加了一个/S选项,这意味着可以使用“ plus”语法来消除对包装器的需求。但是考虑到TCC / LE具有直接支持选项的内置TOUCH命令,这确实仍然使自己的生活变得不必要。COPYCOPY /SFOR/S


2
+1 COPY /B file+,,是必经之路,不需要任何额外的东西... :-)
Tamara Wijsman

3
Powershell方式:(ls file).LastWriteTime = DateTime.now
Tamara Wijsman

5

由于它们随时可用,因此我建议您利用unxutils。它们包含findtouch命令,这将使此操作非常容易。

切换到最顶层目录后,您要修改:

找 。-类型f -exec touch {} +

5

要仅使用现有的Windows功能(无需安装其他功能),请尝试以下方法之一:

forfiles /P C:\Path\To\Root /S /C "cmd /c Copy /B @path+,,"  

(以递归方式“触摸”从指定路径开始的所有文件)

要么

forfiles /S /C "cmd /c Copy /B @path+,,"   

(以递归方式“触摸”从当前目录开始的所有文件)


3
-1这些命令将文件从子文件夹复制到根目录,结果是一团糟。
TonyG

1
+1稍作修改以解决@TonyG所说的问题:forfiles / S / C“ cmd / c复制/ B nul:+,”
Alex Dupuis

不会更改上次修改的时间
beppe9000

4

我知道这可能为时已晚,但是尽管如此,我会留下答案,以防其他人需要相同的东西。

在Windows 7上,John T的答案对我不起作用。经过一番研究,我发现这个名为SKTimeStamp的实用程序可以完美地完成工作。

这是一篇有关其工作原理的详细信息:http : //www.trickyways.com/2009/08/how-to-change-timestamp-of-a-file-in-windows-file-created-modified-and -访问/

这是您需要执行的步骤:

  • 安装应用程序
  • 转到您需要更改时间戳的目录
  • 在搜索框中搜索*,以便资源管理器显示所有文件
  • 找到所有文件后,将其全部选中,右键单击它们,然后选择“属性”。
  • 在对话框中,选择“时间戳记”选项卡
  • 根据需要调整日期和时间,然后点击“ 触摸”

瞧!您的所有文件均已更新!无需任何Unix实用程序或命令行。


1

或者,一旦有了某种“触摸”工具,您就可以使用Windows内置的工具:

for /r %i in (C:\Path\To\Root\*) do @touch "%i"

要么

forfiles /P C:\Path\To\Root /S /C "touch @file"

(注意:如果您是从批处理文件中执行此操作,并且想使用for命令,请确保对变量使用双百分号。(例如,%%i代替%i


1

对我来说,它在Windows 7上也失败了。我使用了不同的语法并使它起作用:

forfiles /c "cmd /c touch @file"

注意,我没有使用递归选项。


1

使用powershell:

C:\> powershell  (ls your-file-name-here).LastWriteTime = Get-Date

这对我不起作用:The property 'LastWriteTime' cannot be found on this object.
Ben N

它在Windows Server 2012中为我工作:(ls。\ backup_db_20150810.sql).LastWriteTime = Get-Date
ThiagoAlves

0

参考上面的John T的答案:

我试图理解以find' \;和' 结尾的'exec命令之间的区别(我不知道后者)。

这很有用:(从这里开始

-exec command ;
执行命令;如果返回0状态,则为true。所有以下要查找的参数都将作为命令的参数,直到参数由';'组成 遇到。字符串'{}'被当前文件名替换为在命令参数中出现的所有地方,而不仅仅是在单独的参数中(如在某些版本的find中)。

-exec command {} +
-exec操作的此变体在选定的文件上运行指定的命令,但是通过在末尾附加每个选定的文件名来构建命令行。该命令的调用总数将大大少于匹配文件的数目。命令行的构建与xargs构建命令行的方式几乎相同。命令中仅允许使用一个'{}'实例。该命令在起始目录中执行。

考虑一个c:\myfolder包含2个文件的文件夹a.txtb.txt

  1. find . -type f -exec touch {} +解释为:
    touch a.txt b.txt
    这类似于xargs的工作方式

  2. find . -type f -exec touch {} \;被解释为:
    touch a.txt
    touch b.txt

因此,#1快得多(但也受到以下限制:命令后面exec只能有一个{}占位符)。


很棒的评论,有很好的信息,但不是问题的答案。如果这是一条评论,则需要+1。
TonyG

1
:)我
记不住

0

对当前目录和所有子目录使用PowerShell:

dir -R | foreach { $_.LastWriteTime = [System.DateTime]::Now }

或者,您可以在之后指定一个文件夹dir

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.