2017-02-19 59 views
1

的今天我做了一個重大錯誤在處理我的selfhosted備份系統和清盤刪除關於我的用戶文件夾的一半。幸運的是,備份存在並能夠複製我的所有數據。不好的部分是每個恢復的文件在文件名中都有一個時間戳。批次或擊刪除時間戳在成千上萬的文件

所以這是filename.file文件,現在的文件名〜20170401-1999.file

我不是太亮,當涉及到批處理文件或什麼不是,但有什麼辦法一個BAT可編程爲遍歷每個文件名並取出時間戳?每個時間戳都以〜開始,並以文件類型的週期結束。因此,刪除所有包括和在代字符之後和停止在該字符之前的角色將會解決問題。

有一些4600·需要的文件固定與多種文件類型的擴展。我在Windows 10 Pro上,並能夠使用PowerShell或bash修復錯誤。我安裝了Windows Linux子系統,因此也可以使用bash腳本。

+0

在每個文件名中是否總是出現一個'〜'? – aschipfl

+0

已經有了一個答案,但是它在從備份恢復的每個文件中都只出現一次。非恢復文件只是filename.type,而恢復文件是文件名〜dategroup-timegroup.type(I.E. resume〜20170409-173314.pdf –

+0

可以使用Internet上的任何免費可用文件重命名實用程序輕鬆完成此操作。 – Squashman

回答

1

的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].*

  • 匹配僅限於文件-File),坐落在當前目錄下的子樹-Recurse)的任何地方。
    要只匹配位於直接在當前目錄下的文件,刪除-Recurse

  • { ... })傳遞到Rename-Item小命令的-NewName參數的腳本塊計算新的文件名:

    • $_.Name返回輸入文件的名稱($_是Powershell的用於表示在手輸入對象自動變量)。
    • -replace '~[^.]+'執行基於正則表達式字符串替換:'~[^.]+'匹配~隨後比.[^.])其他字符的任何非空序列(+).;不指定替換字符串隱式使用空字符串,以便匹配部分從名稱中有效刪除。
0

從我的頭頂只是一些想法。

可以遍歷文件,併爲每個文件名,可以替換/~\d+-\d+/""(即空字符串)匹配正則表達式的子字符串,並使用修改後的字符串作爲文件的新名稱。

0
@ECHO OFF 
SETLOCAL 

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

GOTO :EOF 

你需要改變的sourcedir設置,以滿足您的具體情況。

爲了測試目的,所需的REN命令僅僅是ECHO驗證命令是否正確後,將ECHO(REN更改爲REN以實際重命名文件。

使用基本形式的子目錄執行無目錄名掃描並指定爲%%a。然後使用~作爲分隔符,將發現的全名的名稱部分標記爲%%p%%q。如果第二個令牌是不是空的,然後我們在%%q時間戳所以形成從部分%%p新的文件名,並從mklement0的%%a

0

變化延伸,而不正則表達式

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