2012-02-10 19 views
13

¿Hay alguna forma de buscar archivos en un directorio basado en la fecha? Quiero encontrar todos los archivos con fecha de creación mayor que una fecha específica, ¿es posible hacerlo con el comando dir?Buscar por fecha usando la línea de comando

+0

'dir/OD' clasificará por fecha, al menos – nolegs

+1

dir no se puede, pero el comando Unix encontrar * puede *. [Dos puertos disponibles aquí] (http://sourceforge.net/projects/unxutils/) –

+0

http://superuser.com/a/326025/3588 en SuperUser es una solución elegante que utiliza 'xcopy' sin copiar –

Respuesta

4

dir por sí misma no puede filtrar por fecha, pero puede analizar la salida de dir usando el comando for. Si en su país dir imprime la fecha en formato YMD, entonces solo necesita compararla con una fecha determinada. Si el orden de las partes de la fecha es diferente, entonces tiene que usar otro comando for para analizar la fecha y cambiarla a YMD. Esto mostrará una lista de archivos modificados después del 5 de febrero.

@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 hace la comparación de cadenas estándar, por lo que al final se puede obtener línea adicional si la línea pasa Resumen de la comparación. Para evitarlo, puede utilizar if %%A GTR 2012-02-05 if exist %%B echo %%A %%B

EDIT: Hay incluso mejor enfoque que evita el análisis de dir de salida y también permite buscar por el tiempo, no sólo por fecha:

@Echo Off 

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

gracias eso es lo que necesito, ¿puedo usar la hora: minutos con la comparación. Finalmente, hay libros útiles para aprender scripting de shell. – developer

+0

Para usar los minutos en comparación, realice los siguientes cambios: 'tokens = 1,2,4' y luego' if "%% A %% B" GTR "2012-02-05 11:23" echo %% A %% B %% C' Para aprender, puede comenzar con http://en.wikipedia.org/wiki/Batch_file y luego continuar con tres primeros enlaces externos. – MBu

3

Bien usted no puede Por lo que yo sé, pero este tipo de creo que funcionará, pero aún así no sirve de nada a menos que tenga un intervalo de fechas corta;)

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

¡Agradable! Use 'dir/tc' para trabajar con las fechas de creación. – Marc

35

Acaba de ser descubierto el comando forfiles .

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

una lista de todos los archivos de registro modificados más de siete días de edad, en todos los subdirectorios, aunque no parece que mirar la fecha de creación. Admite la especificación de una fecha específica.

Consulte forfiles /? para obtener más información.

+0

¡Súper útil! (cuando no hay disponible PowerShell) NOTA: Si desea que los archivos se modifiquen después de una fecha, necesita '+' en lugar de '-' para el parámetro'/d', entonces algo como '+ 02/05/2012' en lugar de' -7 '. También para mostrar la salida de fecha y hora de cada archivo, puede usar 'cmd/c echo @fdate @ftime @ path' – bob

+4

+1 Esta debería ser la respuesta aceptada –

+1

Advertencia: Ay de ustedes que quieran usar las rutas UNC con esto. O en muchos otros lugares en Windows ... –

0

Esto es fácil de hacer con PowerShell. Sé que su pregunta era sobre cmd, pero PS está incluida en Windows 7 y versiones posteriores. También se puede instalar en XP y Vista.

Utilice el comando Get-ChildItem (con alias dir) para obtener todos los archivos. Transmita la salida al comando Where-Object (con alias ?) para devolver archivos donde la fecha sea mayor que (-gt) una fecha específica.

Para PowerShell 2.0 (por defecto en Windows 7), se debe utilizar un ScriptBlock:

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

Para Powershell 3.0 (por defecto en Windows 8) y hasta puede utilizar esta sintaxis más simple en su lugar:

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

El comando dir -file devuelve una colección de objetos System.IO.FileInfo. Este objeto de archivo tiene muchas propiedades que puede usar para el filtrado complejo (tamaño de archivo, fecha de creación, etc.). Consulte MSDN para la documentación.

+0

Probé: dir. * .svg | ? LastWriteTimeUtc -gt ([datetime] "2013-05-01") pero recibió "Where-Object: no se puede vincular el parámetro 'FilterScript'. No se puede convertir el valor" LastWriteTimeUtc "de tipo" System.String "para escribir" System.Management ". . Automation.ScriptBlock ". –

+0

Creo que la sintaxis que utilicé funciona para PS 3.0 y superior. Si tiene PS 1.0 o 2.0, debe usar un scriptblock de la siguiente manera:' |? {$ _. LastWriteTimeUtc -gt ([datetime] "2013-05-01")} ' – bouvierr

+0

Ah, estoy en Windows 7 con PS 2. Gracias –

2

una manera más fácil para mí es algo así como

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