2012-02-10 42 views
13

Czy istnieje sposób wyszukiwania plików w katalogu na podstawie daty? Chcę znaleźć wszystkie pliki z datą utworzenia większą niż konkretna data, czy można to zrobić za pomocą polecenia dir?Wyszukiwanie według daty za pomocą linii poleceń

+0

'dir/OD' będą sortować według daty, przynajmniej – nolegs

+1

reż nie może, ale Unix znaleźć polecenia * można *. [Port Dos dostępny tutaj] (http://sourceforge.net/projects/unxutils/) –

+0

http://superuser.com/a/326025/3588 na SuperUser to eleganckie rozwiązanie wykorzystujące 'xcopy' bez faktycznego kopiowania –

Odpowiedz

4

dir sama nie można filtrować według daty, ale można przeanalizować dane wyjściowe polecenia dir za pomocą komendy for. Jeśli w twoim kraju dir drukuje datę w formacie YMD, musisz tylko porównać ją z podaną datą. Jeśli kolejność części daty jest inna, musisz użyć innej komendy for, aby przeanalizować datę i zmienić ją na YMD. Spowoduje to wyświetlenie listy plików zmodyfikowanych po 5-tym Februrary.

@Echo Off 

for /f "usebackq tokens=1,4 skip=5" %%A in (`dir /-c`) do (
    if %%A GTR 2012-02-05 echo %%A %%B 
) 

if robi standardowe porównanie ciąg, więc w końcu można uzyskać dodatkową linię jeśli podsumowanie linia przechodzi przez porównanie. Aby tego uniknąć, można użyć if %%A GTR 2012-02-05 if exist %%B echo %%A %%B

EDIT: Jest nawet lepsze podejście który unika parsowanie dir wyjścia, a także umożliwia wyszukiwanie według czasu, nie tylko by Date:

@Echo Off 

for /r %%A in (*) do (
    if "%%~tA" GTR "2012-02-05 00:00" echo %%~tA %%A 
) 
+0

dziękuję, to jest to, czego potrzebuję, czy mogę użyć godziny: minuty z porównaniem. Wreszcie są pomocne książki do nauki skryptów powłoki. – developer

+0

Aby użyć minut w porównaniu, należy wprowadzić następujące zmiany: 'tokeny = 1,2,4', a następnie' jeśli "%% A %% B" GTR "2012-02-05 11:23" echo %% A %% B %% C' Aby się nauczyć, możesz zacząć od http://pl.wikipedia.org/wiki/Batch_file, a następnie przejść do trzech pierwszych zewnętrznych linków. – MBu

3

Cóż mogę o ile wiem, ale tego rodzaju, że będzie działać, ale nadal bardzo bezużyteczne, chyba że mają krótki zakres dat;)

for /R %a in (01 02 03 04 05) do dir | find "02/%a/2012" 
+0

Nice! Użyj 'dir/tc' do pracy z datami tworzenia. – Marc

35

właśnie odkrył komendy forfiles .

forfiles /s /m *.log /d -7 /c "cmd /c echo @path" 

wyświetli wszystkie pliki dziennika zmodyfikowane więcej niż siedem dni, we wszystkich podkatalogów, choć nie wydaje się, aby spojrzeć na daty utworzenia. Obsługuje określenie konkretnej daty.

Aby uzyskać więcej informacji, patrz forfiles /?.

+0

Super-użyteczny! (gdy nie ma dostępnej powłoki PowerShell) UWAGA: Jeśli chcesz zmodyfikować pliki po dacie, potrzebujesz '+' zamiast '-' dla parametru'/d', więc np. '+ 02/05/2012' zamiast' -7 '. Aby wyświetlić dane wyjściowe daty i czasu dla każdego pliku, możesz użyć polecenia 'cmd/c echo @fdate @ftime @ path' – bob

+4

+1 To powinno być zaakceptowaną odpowiedzią –

+1

Zastrzeżenie: Biada tym, którzy chcą używać ścieżek UNC. Lub w wielu innych miejscach w Windows ... –

0

Jest to łatwe do wykonania dzięki PowerShell. Wiem, że twoje pytanie dotyczyło cmd, ale PS jest zawarte w Windowsie 7 i późniejszych. Może być również zainstalowany na XP i Vista.

Użyj polecenia Get-ChildItem (alias jako dir), aby uzyskać wszystkie pliki. Wyprowadź dane wyjściowe do polecenia Where-Object (alias jako ?), aby zwrócić pliki, których data jest większa niż (-gt) określonej daty.

Dla PowerShell 2.0 (domyślnie w systemie Windows 7), należy użyć scriptblock:

dir -file | ? {$_.LastWriteTimeUtc -gt ([datetime]"2013-05-01")} 

Dla PowerShell 3.0 (domyślnie w Windows 8) i maksymalnie można użyć tej prostszą składnię Zamiast:

dir -file | ? LastWriteTimeUtc -gt ([datetime]"2013-05-01") 

Komenda dir -file zwraca kolekcję obiektów System.IO.FileInfo. Ten obiekt pliku ma wiele właściwości, które można wykorzystać do złożonego filtrowania (rozmiar pliku, data utworzenia itp.). Zobacz dokumentację w dokumencie MSDN.

+0

Próbowałem: reż. * .svg | ? LastWriteTimeUtc -gt ([datetime] "2013-05-01"), ale otrzymał "Where-Object: Can not bind parameter" FilterScript. "Nie można przekonwertować wartości" LastWriteTimeUtc "typu" System.String ", aby wpisać" System.Management .Automation.ScriptBlock ". –

+0

Składnia, której użyłem, działa na PS 3.0 i wyżej, ale wierzę, że jeśli masz PS 1.0 lub 2.0, musisz użyć skryptu takiego jak:' |? {$ _. LastWriteTimeUtc -gt ([datetime] "2013-05-01")} ' – bouvierr

+0

Ah Jestem na Windows 7 z PS 2. Dzięki –

2

łatwiejszy sposób dla mnie jest czymś

dir /s *.xlsx | find "07/14/2016"