2017-02-21 47 views
0

我有一個非常大的目錄,並且希望將比90天更早的文件夾/文件移動到另一個目錄。將某個時代的文件夾和文件移動到另一個目錄的命令

我的出發點是這個cmd命令

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

這將返回是超過90天的文件,但我需要一個移動命令替換回聲。我不知道如何將這些文件完整地與父目錄結合起來。

這個工作將保持文件夾結構?

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

有沒有人有任何建議或預見任何問題試圖這樣做?

Robocopy不是一個選項。

+0

堆棧溢出搜索[\ [批處理文件\]或\ [cmd \]移動文件比舊](http://stackoverflow.com/search?q=%5Bbatch-file%5D+or+%5Bcmd %5D +移動+文件+舊+ +)返回75次。所以這絕對不是第一次被問到。我建議你閱讀找到的問題和答案。使用Windows命令解釋程序的主要問題是沒有內置的時間差計算支持。最好使用PowerShell。所有「早於」問題的主批處理文件/ cmd主題爲:[用於刪除N天前文件的批處理文件](http://stackoverflow.com/questions/51054/)。 – Mofi

回答

1

forfiles執行/C選項後的命令行,並將當前迭代的目錄作爲工作目錄。 /S選項也是如此。

參考@file返回純文件名(帶引號);參考@relpath返回相對於給定根的路徑(位於/P選項後面,該選項默認爲當前目錄)。

所以你可以嘗試這樣的事情(注意cmd /C前綴需要cmdmoveechoif -internal命令;大寫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即可。


以下命令行也可能工作爲樣本路徑,但它是要失敗的肯定的情況下,目標路徑包含的空格或其他有毒的人物,因爲報價是不正確的處理:

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

美麗的答案, 關於這個命令(道歉我不知道如何格式化它,就像你上面做的那樣) forfiles/S/D -90/C「cmd/C if isdir == FALSE %@f(@relpath)do @(2> nul mkdir 0x22C:\ temp \%〜F \ 0x22&ECHO move @relpath 0x22C:\ temp \%〜F0x22))「 這是要工作if有子文件的子目錄中有文件嗎? 在我的情況下,它可能我可以根據自己創建的日期移動頂級文件夾,這會更容易嗎? – Krom

+0

是的;有'/ S'開關告訴'forfiles'也枚舉子目錄;即使子目錄本身可能與過濾器('/ D','/ M')不匹配,任何包含的子項目如果匹配仍然會返回。請注意''forfiles/D'不關心創建日期,它只考慮文件和目錄的最後修改日期...... – aschipfl

+0

使用Google搜索我看不到在文件/文件夾的創建日期上運行的任何開關這件事。我相信這個命令會刪除一個大於90的文件夾,但又是因爲/ D是基於修改日期。 forfiles/p「c:/ temp」/ s/m *。*/c「cmd/c Del @path」/ d -90 問題是有人可以在89天修改文件,移動一切,但該文件可能會造成大混亂。也許這不是嘗試這樣做的最好方法,因爲基於頂層目錄創建日期將是最好的方式,我不知道我能做到。 – Krom

相關問題