批量或Bash删除数千文件中的时间戳

今天我在处理我的自备备份系统方面犯了一个重大错误,结果删除了大约一半的用户文件夹。 幸运的是,备份存在,并能够复制我的所有数据。 坏的部分是每个被恢复的文件在文件中都有一个时间戳。

所以filename.file的文件现在是filename〜20170401-1999.file

对于batch file我不太清楚,但是有没有什么方法可以编程一个BAT来运行每一个文件名并取出时间戳? 每个时间戳以〜开始,以文件types的周期结束。 所以删除所有包括和之后的代字符和停止在字符之前的字符将解决问题。

有大约4600个文件需要修复,有各种各样的文件types扩展名。 我在Windows 10 Pro上,并能够使用PowerShell或bash修复错误。 我安装了Windows Linux子系统,所以bash脚本也是可以接受的。

PowerShell提供了一个简单的解决方案:

 Get-ChildItem -Recurse -File -Filter *~* | Rename-Item -NewName { $_.Name -replace '~[^.]+' } -WhatIf 
  • -WhatIf 预览重命名操作; 删除它,一旦你确认命令将按预期工作。

  • 为了简单起见,我已经假设包含~任何文件名都必须重命名; 如果必须消除误报,则可以改进匹配:
    Get-ChildItem -Recurse -File *~[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9].*

  • 匹配仅限于位于当前目录的子树-Recurse )中任何位置的文件-File )。
    要仅匹配直接位于当前目录中的文件,请删除-Recurse

  • 传递给Rename-Item cmdlet的-NewName参数的脚本块( { ... } )会计算新的文件名:

    • $_.Name返回输入文件的名称( $_是PowerShell的自动变量,用于表示手头的输入对象)。
    • -replace '~[^.]+'执行一个基于正则表达式的字符串替换: '~[^.]+'匹配一个~后跟任何非空字符( + )以外的字符.[^.] )。 不指定替换字符串隐式使用空字符串,以便匹配的部分被有效地从名称中删除。

只是从头顶上的一些想法。

你可以遍历这些文件,对于每一个文件名,你可以用正则表达式/~\d+-\d+/替换与"" (即空字符串)的子字符串,并使用修改后的字符串作为文件的新名称。

 @ECHO OFF SETLOCAL SET "sourcedir=U:\sourcedir" FOR /f "delims=" %%a IN ( 'dir /b /s /ad "%sourcedir%\*" ' ) DO ( FOR /f "tokens=1,2delims=~" %%p IN ("%%~na") DO ( IF "%%q" neq "" ECHO(REN "%%a" "%%~p%%~xa" ) ) GOTO :EOF 

您需要更改sourcedir的设置以适应您的情况。

所需的REN命令仅用于测试目的。 在确认命令正确后 ,将ECHO(REN改为REN重新命名文件。

执行一个目录扫描与基本形式的子目录与董事名称并分配给%%a 。 然后使用~作为分隔符,将发现的全名的名称部分标记为%%p%%q 。 如果第二个标记不为空,那么我们在%%q有一个时间戳记,所以从%%p的部分形成新的文件名,从%%a

mklement0的变化没有正则表达式

  Get-ChildItem -Recurse -File -Filter *~*.file | rename-item -NewName {"{0}{1}" -f ($_.BaseName -split "~")[0], $_.Extension } -WhatIf 

简短版本:

  gci -Rec -File -Filter *~*.file | ren -n {"{0}{1}" -f ($_.Base -split "~")[0], $_.Extension } -WhatIf