73

ディレクトリ内の最新のファイルを新しい場所にコピーする必要があります。これまでのところ、forfilesコマンドに関するリソース、日付関連の質問here 、および別の関連する質問を見つけました。パーツを揃えるのにちょっと苦労しました!そのディレクトリ内の最新のファイルを新しい場所にコピーするにはどうすればよいですか?

4

9 に答える 9

137

受け入れられた回答は、コマンドで最新のファイルを使用してから終了する例を示しています。他の複雑な操作を含むバット ファイルでこれを行う必要がある場合は、次を使用して、最新のファイルのファイル名を変数に格納できます。

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

%NewestFile%これで、bat ファイルの残りの部分全体を参照できます。

たとえば、ディレクトリからデータベースの .bak ファイルの最新バージョンを取得し、それをサーバーにコピーしてから、データベースを復元するために使用するものは次のとおりです。

: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"
于 2009-06-10T21:32:12.100 に答える
69

Windowsシェル、1つのライナー:

FOR /F "delims=" %%I IN ('DIR *.* /A-D /B /O:-D') DO COPY "%%I" <<NewDir>> & EXIT
于 2008-09-18T22:48:39.620 に答える
11

スペースを使用したファイル名でこれを機能させるには、受け入れられた回答の修正版が必要です。

FOR /F "delims=" %%I IN ('DIR . /B /O:-D') DO COPY "%%I" <<NewDir>> & GOTO :END
:END
于 2011-02-22T18:56:07.440 に答える
6
@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

フォルダから最新のファイルをコピーしようとする試み

ソースフォルダーとターゲットフォルダーを設定するだけで機能するはずです

これはフォルダーを無視し、ファイルのみに関係します

たとえば、DIRパスでファイルタイプを選択することをお勧めし*.*ます*.zip

TIMEOUTはwinXPでは機能しないと思います

于 2014-11-19T23:12:36.913 に答える
3

あなたがWindowsを要求したことは知っていますが、とにかくこれを追加すると思っていました.Unix / Linuxでは次のことができます:

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

現在のディレクトリ内のすべてのファイルを変更時間順に並べ替えて一覧表示し、最新のものを /somedir/ に cp します。

于 2008-09-18T21:57:27.187 に答える
2

これにより、2 つ目の cmd.exe ウィンドウが開きます。削除したい場合は、/K を /C に置き換えます。

明らかに、 new_file_loc を新しいファイルの場所に置き換えます。

@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
于 2008-09-18T21:58:50.833 に答える
2

@クリス・ノエ

& の前のスペースは、前のコマンドの一部になることに注意してください。これは、末尾の空白を値に喜んで挿入する SET に悩まされています。

環境変数に追加される末尾のスペースを回避するには、set コマンドを括弧で囲みます。

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

于 2011-06-29T17:39:18.163 に答える
-2

バッシュ:

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

ここで、「newestfile」は newestfile になります

あるいは、newdir/STR または単に newdir を実行することもできます

壊す:

  1. すべてのファイルを {time} {file} 形式でリストします。
  2. それらを時間順に並べ替えます
  3. 最後の 1 つを取得します。
  4. 時間を切り取り、開始/終了から空白を削除します
  5. 結果の値をコピー

重要

これを1回実行すると、最新のファイルはコピーしたばかりのものになります:p (両方が同じ検索範囲内にあると仮定します)。したがって、これを複数回機能させたい場合は、コピーするファイル番号を調整する必要がある場合があります。

于 2008-09-18T22:00:11.843 に答える