我知道linux中有一种方法可以过滤特定时间后生成的所有文件。
但是我们怎么能在Windows命令行中这样做呢?或者在bash中。
例如,我在一个文件夹中有三个文件。在10/10/2016之后,12:12:54,在此文件夹中生成了一个新文件,我需要知道新文件的名称,大小和路径。
要么,
我不知道什么时候会生成新文件。我想每10分钟检查一次。如果在特定之后生成了一些新文件,我可以获取文件的名称,路径和大小。
我搜索一下这个,我知道我可以使用forfiles /P directory /S /D +08/01/2013
来做到这一点。但它将显示在目录下的08/01/2013之后修改的所有文件。但我希望它显示目录中的文件夹和目录文件夹中的所有文件(不在其子目录中)。
答案 0 :(得分:0)
虽然您没有表现出任何自己的努力来解决您的任务,但我决定提供一个脚本,该脚本返回自上次执行以来创建的文件列表。它不检查文件创建时间戳,因为纯batch-file解决方案本身不支持日期/时间数学。相反,它会生成一个文件列表,将其存储在一个临时文件中,并将其与之前保存的列表进行比较。
反对依赖文件时间戳,这肯定会识别每个新文件。检查时间戳时,自上次运行错误以来文件可能被视为新文件,或者错误地识别新文件,尤其是在执行脚本期间创建的文件。
所以这是代码:
@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任务计划程序可能是更好的选择。