it-swarm.com.de

Suchen Sie nach Dateien, die nach einem bestimmten Datum über die Befehlszeile geändert wurden

Ich muss eine Datei auf meiner Festplatte suchen, die nach einem bestimmten Datum mit der Befehlszeile geändert wurde.

Zum Beispiel:

   dir /S /B WHERE modified date > 12/07/2013
11
Daniel Peñalba

Verwenden Sie dazu PowerShell. Versuchen Sie Folgendes:

Get-ChildItem -Recurse | Where-Object { $_.LastWriteTime -ge "12/27/2016" }

21
Ralf de Kleine

Der forfiles Befehl funktionierte für mich unter Windows 7. Der Artikel ist hier

http://www.windows-commandline.com/find-files-based-on-modified-time/

Microsoft Technet-Dokument: http://technet.Microsoft.com/en-us/library/cc753551.aspx

Für das obige Beispiel:

forfiles /P <dir> /S /D +12/07/2013
  • / P Der Startpfad für die Suche
  • / S Rekurse in Unterverzeichnisse
  • / D Suchdatum, das "+" bedeutet "größer als" oder "seit"
29
John Jesus

Ich wurde nach der Größe der Dateien geändert und hatte Powershell nicht, ich verwendete das Folgende, aber der Hinweis kam aus einem anderen Beitrag

http://www.scotiasystems.com/blog/it-hints-and-tips/quick-way-to-find-recently-changed-files-in-windows und Windows-Befehl für Nur Dateigröße

set Target=E:\userdata
rem Date format is M-D-YYYY
set date=12-13-2013
set Filelist=d:\temp\filelist.txt
set Sizelist=d:\temp\sizelist%date%.csv

echo Target is %Target%
echo Start date is %date%
echo file list is %Filelist%
echo Sizelist is %sizelist%

Xcopy %Target% /D:%date% /L /S  > %Filelist%
echo FileSize (bytes), FileName > %sizelist%

For /f "tokens=1 delims=;" %%j in (%Filelist%) do (
                call :Size "%%j"
                )    
Goto :EOF

:Size
@echo off
echo %~z1, %1 >> %sizelist%
3

Ich hatte das gleiche Problem, also erstellte ich eine Liste mit XCOPY und dem veränderten Datum, nach dem ich gesucht hatte, und verwendete dann eine for-Schleife, um die Liste zu durchlaufen und die für jede Datei benötigten Datums-/Uhrzeitinformationen zu einem Protokoll hinzuzufügen.

xcopy X:\file_*.log X:\temp /D:07-17-2014 /L /Y > X:\files.txt
for /f "tokens=* delims=" %%a in (X:\files.txt ) do (
    @echo %%~ta %%a >> X:\files.log
)

Daraus ergab sich so etwas wie das Folgende, was ich genau wollte.

X:\>()
07/17/2014 09:41 AM X:\file_201407170600.log

X:\>()
07/17/2014 09:41 AM X:\file_201407170615.log

X:\>()
07/17/2014 09:23 AM X:\file_201407170630.log
2
thehme

Sie können Dateien, die nach einem bestimmten Datum geändert wurden, mit XCOPY wie in diesem Beispiel suchen und nach Dateien seit dem letzten Tag des Jahres 2018 suchen:

xcopy *.* c:\temp\*.* /D:12-31-2018 /L /S

In diesem Beispiel befinden Sie sich in dem Verzeichnis, in dem Ihre Suche beginnt.

c:\temp *. * ist nur eine Syntaxanforderung, da wird nichts kopiert.

/ D: 12-31-2018 gibt das Änderungsdatum der Dateien an, nach dem Sie suchen, einschließlich des angegebenen Datums.

/ L zeigt die Dateinamen an, einschließlich Laufwerk und Pfad. Außerdem werden von xcopy keine Dateien kopiert.

/ S Suche in Unterverzeichnissen.

1
David Hernán

Wenn Sie sich für Power Shell entscheiden, funktioniert dies auch mit Zeit- und Datumsbereichen:

Get-ChildItem -Recurse | Where-Object {($_.LastWriteTime -ge "04/15/2018 20:00:00") -and ($
_.LastWriteTime -lt "04/15/2018 21:00:00")}

So verwenden Sie ein programmatisches Datum oder ein locale-agnostisches Datum:

Get-ChildItem -Recurse | Where-Object {($_.LastWriteTime -ge (new-object System.DateTime 2018, 1, 10, 12, 30, 00)) -and ($_.LastWriteTime -lt (new-object System.DateTime 2018, 1, 14, 12, 15, 59))}

Wo Datum und Uhrzeit in aufsteigender Zeitspezifizitätsreihenfolge eingegeben werden:

Jahr, Monat, Tag, Stunde, Minute, Sekunde

1
egallardo

Ich hatte eine ähnliche Herausforderung. Ich habe forfiles verwendet, aber mir ist aufgefallen, dass es> = und nicht nur> gibt. Das Eingabedatum war eine Variable, und so wollte ich nicht durch eine Reihe von Reifen/Schleifen gehen, um date + 1 day Zu berechnen (denken Sie an die Logik für den letzten Tag des Monats oder den letzten Tag des Jahres).

Ich habe eine Funktion erstellt, die forfiles für ein bestimmtes Datum ausführt. Das gibt uns alle Dateien mit einem Änderungsdatum, das >= _date_ Ist. Und für jede Datei überprüfe ich, ob das Änderungsdatum _date_ Ist, und drucke die Ausgabe nur dann in eine Datei, wenn sie nicht gleich ist. Das bedeutet, dass die Ausgabedatei nur Einträge für Dateien enthält, die > _date_ Sind.

Ich kann dann überprüfen, ob die Ausgabedatei vorhanden ist, um festzustellen, ob Dateien im aktuellen Verzeichnis das Eingabedatum überschreiten. Wenn ich wissen möchte, welche Dateien neuer sind, kann ich den Inhalt der Ausgabedatei anzeigen.

Schließlich wurde meine Eingabe aus einer Datei geparst, die das Datumsformat MM/TT/JJJJ verwendet, dh, es ist der 07.01.2013 für den ersten Juli. Das Datum aus FORFILES verwendet jedoch keine führenden Nullen. Ich muss also übersetzen, indem ich führende Nullen lösche.

Mein erster Versuch war es,/A zu benutzen und zu denken, dass es die führenden Nullen fallen lässt. Es liest den Wert nicht als oktal - wiederholen Sie nicht den Fehler meines ersten Versuchs. Also habe ich gerade eine kleine Hilfsfunktion erstellt: getNum, die führende Nullen löscht.

:: ########################################################################
:: :findNewerFiles
::
::     Windowsfile interface will only tell you if a file is
::     greater than OR EQUAL to the current date. Had to figure a way
::     to get just greater than.
::
::     Use 'forfiles' to find all files that are >= the specific date, and for
::     each file if the files date is not equal to the specific date then echo
::     the file information into the new-file-log.
::
::     If the new-file-log exists after we're all done, then it means there is
::     at least one file newer than the specified date.
::
:: PARMS:
::
::     %1 - MONTH
::
::     %2 - DAY
::
::     %3 - YEAR
::
:: ERRORLEVEL:
::     0  if no newer files found
::     !0 if a newer file was found
::
:findNewerFiles
SETLOCAL
    CALL :getNum M "%~1"
    CALL :getNum D "%~2"
    CALL :getNum Y "%~3"


    SET "RETVAL=1"

    %bu.callecho% PUSHD %G[3PROOT_UNC]%

    ECHO Last build date was: %M%/%D%/%Y%
    del "%G[NEW_FILE_LOG]%" >nul 2>&1

    FORFILES /p .\ /S /D +%M%/%D%/%Y% ^
             /c "cmd /c if /I @ISDIR == false if not @fdate==%M%/%D%/%Y% echo @fdate @path>>%G[NEW_FILE_LOG]%"

    IF EXIST "%G[NEW_FILE_LOG]%" (
        SET "RETVAL=0"
        TYPE "%G[NEW_FILE_LOG]%"
    )

    %bu.callecho% POPD
(ENDLOCAL
 EXIT /B %RETVAL%)





:: ########################################################################
:: :getNum
::
::     Remove leading 0 from input number and place results in output variable
::
:: PARMS:
::
::     %1 - OUTPUT VARIABLE
::          Name of the output variable to be populated
::
::     %2 - INPUT VARIABLE
::          The number to have leading zeros trimmed from
::
:: ERRORLEVEL:
::     0  always
::
:getNum
SETLOCAL
    SET "D=%~1"
    SET "M=%~2"

    IF "%M:~0,1%" EQU "0" (
        SET "M=%M:~1%"
    )

(ENDLOCAL
 SET "%D%=%M%"
 EXIT /B 0)
0
John Rocha