2008-09-18 16 views

Respuesta

59

shell de Windows, un trazador de líneas:

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

Probablemente debería ser exit/by goto: eof para evitar cerrar la ventana de cmd ... – Joey

+6

Los delimitadores predeterminados son y por lo que es mejor agregar "delims =" después de FOR/F para aceptar nombres de archivos con espacios. El comando completo será FOR/F "delims =" %% I IN ('DIR *. */B/O: -D') DO COPY %% I <> & EXIT – Cheburek

+1

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

2

Sé que pidió para Windows, pero que me gustaría añadir esto de todos modos, en Unix/Linux que podría hacer:

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

el que figurarán todos los archivos en el directorio actual ordenados por fecha de modificación y luego cp el más reciente para/somedir/

+0

No esperaba esta respuesta en esta publicación. Muchas gracias. – Mrk

2

Esto abrirá una segunda ventana de 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 
-2

Bash:

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

donde "newestfile" se convertirá en el newestfile

, alternativamente, se podría hacer newdir/STR o simplemente newdir

Desglose:

  1. enumera todos los archivos en {time} {file} formato.
  2. ordenarlos por el tiempo
  3. obtener el último
  4. cortó el tiempo y el espacio en blanco desde el principio/final
  5. copia resultante valor

Importante

Después de ejecutar esta vez, el archivo más nuevo será lo que acaba de copiar: p (suponiendo que ambos estén en el mismo alcance de búsqueda). Así que es posible que deba ajustar qué número de archivo copiará si desea que funcione más de una vez.

114

la respuesta aceptada da un ejemplo de uso del archivo más reciente en un comando y después de salir. Si necesita hacer esto en un archivo bat con otras operaciones complejas se puede utilizar el siguiente para almacenar el nombre de archivo del archivo más reciente en una variable:

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

Ahora puede hacer referencia% NewestFile% en el resto de tu archivo de murciélago

Por ejemplo, esto es lo que utilizamos para obtener la última versión de una base de datos.bak de un directorio, copiarlo en un servidor, y luego restaurar la 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 <username> -P <password> -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" 
+4

Excelente ... Estaba buscando cómo obtener el archivo más reciente, y el ejemplo del código que da es la razón exacta por la que estoy buscando este , restaurando una copia de seguridad de servidor sql! – tbone

+0

Su bienvenida, me alegro de poder ayudar =). –

+1

Esto fue útil. Solo una nota para decir, si sus archivos están inoportunamente en subdirectorios (como el mío), puede usar el indicador '/ S' en DIR para verificar recursivamente. es decir, inserte '/ S' después del DIR anterior y debería funcionar. –

9

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

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

¿Qué cambios son necesarios para admitir espacios? SOLO las comillas en torno a "%% I"? – arichards

+0

@arichards - Eso es correcto. – TimH

2

@ Chris Noe

Tenga en cuenta que el espacio delante de la & se convierte en parte de la orden 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.

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

+0

Sí, funciona, pero la forma estándar para 'SET' es usar las comillas como 'establecer" NewestFile = %% I "' – jeb

+0

que podría ser su estándar, pero el mío es parens ... :-) – Richard

+0

Pero los paréntesis fallan para '(set var = & complex ^)' quotes funciona 'set" var = & complex^"' – jeb

2
@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 intento de copiar el archivo más reciente de una carpeta

acaba de establecer las carpetas de origen y de destino y debería funcionar

Ésta hace caso omiso de las carpetas, tener en cuenta únicamente los archivos

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

TIMEOUT no funciona en winXP Creo que

Cuestiones relacionadas