2016-10-10 56 views
-1

我知道在linux中有一種方法可以過濾特定時間後生成的所有文件。 但我們怎麼能在Windows命令行中做到這一點?或者在bash中。例如,我在一個文件夾中有三個文件。在10/10/2016,12:12:54之後,新文件生成到此文件夾中,我需要知道新文件的名稱,大小和路徑。 或 我不知道何時會生成新文件。我想每10分鐘檢查一次。如果在特定後生成了一些新文件,我可以獲取文件的名稱,路徑和大小。 我搜索了一些關於這方面的信息,我知道我可以使用forfiles /P directory /S /D +08/01/2013來做到這一點。但它會顯示所有在08/01/2013之後在目錄下修改的文件。但我希望它顯示目錄中的文件夾和目錄文件夾中的所有文件(不在其子目錄中)。如何在windows中查找特定時間點後的新文件?(命令行)

+0

輸入'forfiles /?'不要使用'/ s'。參見'timeout /?'和'goto /?'。輸入'Help'。 – 2016-10-11 00:21:13

+0

作爲超時的替代方案,您可以使用任務計劃程序,每十分鐘運行一次批處理文件(我猜)。 – geisterfurz007

+0

'forfiles'只檢查最後修改日期,而不檢查創建日期;此外,它根本不關心時間,所以你不能用它來檢查自從最近10分鐘以來創建的新文件(如果我的意圖正確)。另一種完全不同的方法是:將文件列表(參見'dir /?')存儲到文本文件中,並將其與每10分鐘一次的實際可用文件進行比較?這避免了批處理本身不支持的日期/時間數學... – aschipfl

回答

0

儘管您沒有表現出任何努力來解決您的任務,但我決定提供一個腳本,它返回自上次執行以來創建的文件列表。它不會檢查文件創建時間戳記,因爲純粹的解決方案本身不支持日期/時間數學。相反,它會生成一個文件列表,將其存儲在一個臨時文件中,並將其與先前保存的列表進行比較。

反對依靠文件時間戳,這將肯定會識別每個新文件。檢查時間戳時,文件可能被視爲新的,因爲上次運行錯誤或者新文件可能無法被錯誤識別,特別是在執行腳本期間創建的文件。

所以這裏是代碼:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "TARGET=D:\Data" & rem // (path to the directory to observe) 
set "PATTERN=*.*"  & rem // (search pattern for matching files) 
set "LIST=%TEMP%\%~n0" & rem // (file base name of the list files) 
set "FIRSTALL=#"  & rem /* (defines behaviour upon first run: 
          rem  set to anything to return all files; 
          rem  set to empty to return no files) */ 

rem /* Determine which list file exists, ensure there is only one, 
rem then toggle between file name extensions `.one`/`.two`: */ 
set "LISTOLD=%LIST%.two" 
set "LISTNEW=%LIST%.one" 
if exist "%LIST%.one" (
    if not exist "%LIST%.two" (
     set "LISTOLD=%LIST%.one" 
     set "LISTNEW=%LIST%.two" 
    ) else (
     erase "%LIST%.one" 
     if defined FIRSTALL (
      > "%LIST%.two" rem/ 
     ) else (
      erase "%LIST%.two" 
     ) 
    ) 
) else (
    if not exist "%LIST%.two" (
     if defined FIRSTALL (
      > "%LIST%.two" rem/ 
     ) 
    ) 
) 

rem /* Create new list file, containing list of matching files 
rem sorted by creation date in ascending order: */ 
> "%LISTNEW%" dir /B /A:-D /O:D /T:C "%TARGET%\%PATTERN%" 
if not exist "%LISTOLD%" (
    > nul 2>&1 copy /Y "%LISTNEW%" "%LISTOLD%" 
) 

rem // Search new list file for items not present in old one: 
2> nul findstr /V /I /X /L /G:"%LISTOLD%" "%LISTNEW%" 
if ErrorLevel 2 type "%LISTNEW%" 

rem // Delete old list file: 
erase "%LISTOLD%" 

endlocal 
exit /B 

第一次運行該腳本,在被監控目錄中的所有文件都回來了,除非你改變set "FIRSTALL=#"set "FIRSTALL=",在這種情況下,沒有文件被返回的第一次。

核心命令是findstr,它被配置爲使舊列表文件提供用於搜索新列表文件並返回不匹配行的文字搜索字符串,因此輸出是新列表文件的那些行,其中不會發生在舊的。


假設腳本保存爲new-files-since-last-run.bat,你可以環繞構成爲10分鐘輪詢率一個無限循環,這樣其他的小腳本:

@echo off 
:LOOP 
> nul timeout /T 600 /NOBREAK 
call "%~dp0new-files-since-last-run.bat" 
goto :LOOP 

設置Windows任務計劃可能是更好的選擇。

相關問題