¿Cómo escribo un script por lotes de Windows para copiar el archivo más nuevo desde un directorio?

Necesito copiar el archivo más reciente en un directorio a una nueva ubicación. Hasta ahora he encontrado recursos en el comando forfiles , una pregunta relacionada con la fecha aquí y otra pregunta relacionada . ¡Solo estoy teniendo problemas para juntar las piezas! ¿Cómo copio el archivo más nuevo en ese directorio a un lugar nuevo?

Shell de Windows, un trazador de líneas:

FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <> & EXIT 

La respuesta aceptada proporciona un ejemplo del uso del archivo más nuevo en un comando y luego salir. Si necesita hacer esto en un archivo bat con otras operaciones complejas, puede usar lo siguiente para almacenar el nombre del archivo más nuevo en una variable:

 FOR /F "delims=|" %%I IN ('DIR "*.*" /B /O:D') DO SET NewestFile=%%I 

Ahora puede hacer referencia al% NewestFile% en el rest de su archivo bat.

Por ejemplo, esto es lo que utilizamos para obtener la última versión de un archivo .bak de base de datos de un directorio, copiarlo en un servidor y luego restaurar el archivo db:

 :Variables SET DatabaseBackupPath=\\virtualserver1\Database Backups echo. echo Restore WebServer Database FOR /F "delims=|" %%I IN ('DIR "%DatabaseBackupPath%\WebServer\*.bak" /B /O:D') DO SET NewestFile=%%I copy "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\" sqlcmd -U  -P  -d master -Q ^ "RESTORE DATABASE [ExampleDatabaseName] ^ FROM DISK = N'D:\%NewestFile%' ^ WITH FILE = 1, ^ MOVE N'Example_CS' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example.mdf', ^ MOVE N'Example_CS_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example_1.LDF', ^ NOUNLOAD, STATS = 10" 

Para permitir que esto funcione con nombres de archivo usando espacios, se necesita una versión modificada de la respuesta aceptada:

 FOR /F "delims=" %%I IN ('DIR . /B /O:-D') DO COPY "%%I" <> & GOTO :END :END 

@Chris Noe

Tenga en cuenta que el espacio delante de & se convierte en parte del comando anterior. Eso me ha mordido con SET, que felizmente pone espacios en blanco en el valor.

Para desplazarse por el espacio final que se agrega a una variable de entorno, ajuste el comando set en parens.

Ej. FOR /F %%I IN ('DIR "*.*" /B /O:D') DO (SET NewestFile=%%I)

Sé que preguntaste por Windows pero pensé que agregaría esto de todos modos, en Unix / Linux podrías hacer:

 cp `ls -t1 | head -1` /somedir/ 

Que listará todos los archivos en el directorio actual ordenados por tiempo de modificación y luego cp el más reciente para / somedir /

Esto abrirá una segunda ventana cmd.exe. Si desea que desaparezca, reemplace / K con / C.

Obviamente, reemplace new_file_loc con la ubicación de su nuevo archivo.

 @echo off for /F %%i in ('dir /B /O:-D *.txt') do ( call :open "%%i" exit /B 0 ) :open start "window title" "cmd /K copy %~1 new_file_loc" exit /B 0 
 @echo off set source="C:\test case" set target="C:\Users\Alexander\Desktop\random folder" FOR /F "delims=" %%I IN ('DIR %source%\*.* /A:-D /O:-D /B') DO COPY %source%\"%%I" %target% & echo %%I & GOTO :END :END TIMEOUT 4 

Mi bash de copiar el archivo más nuevo de una carpeta

simplemente configure sus carpetas de origen y destino, y debería funcionar

Este ignora las carpetas, solo se preocupa de los archivos

Se recomienda que elija el tipo de archivo en la ruta DIR cambiando *.* *.zip por ejemplo

TIMEOUT no funcionará en winXP, creo

Intento:

  find -type f -printf "%T@ %p \n" \ | sort \ | tail -n 1 \ | sed -r "s/^\S+\s//;s/\s*$//" \ | xargs -iSTR cp STR newestfile 

donde “newestfile” se convertirá en el archivo más reciente

alternativamente, podrías hacer newdir / STR o simplemente newdir

Descompostura:

  1. enumere todos los archivos en el formato {time} {file}.
  2. ordenarlos por tiempo
  3. obtener el último
  4. cortar el tiempo, y espacios en blanco desde el principio / final
  5. copiar el valor resultante

Importante

Después de ejecutar esto una vez, el archivo más nuevo será lo que acaba de copiar: p (suponiendo que ambos estén en el mismo ámbito de búsqueda). Por lo tanto, quizás deba ajustar qué número de archivo copiará si desea que esto funcione más de una vez.