it-swarm-ja.com

コマンドライン:複数のファイルを日付で連結します

ディレクトリにたくさんの.txtファイルがあります。このディレクトリには、.pngファイルといくつかの.pdfファイルも含まれています。このコマンドを使用して、.txtファイルを正常に連結しました。

@ECHO Off
SETLOCAL
for /r %%f in (*.txt) do (
echo.
type "%%f"
)>> output.doc

GOTO :EOF

上記のコマンドは、オンラインサイトの1つから取得したものです。このコマンドは、.txtファイルをアルファベット順に連結します。しかし、私はそれをそのようにしたくありません、私はそれが変更または作成された日付までに行われることを望みます(変更が推奨されます)。私はその行のヒントを持っています

for /r %%f in(*.txt) do ( 

日付で連結するには、変更する必要があります。このコマンドラインまたはバッチスクリプトは初めてなので、あまり詳しくありません。どうすればいいですか。答えてくれてありがとう。

初めてこの質問を含めなかったことをお詫びします。以前に尋ねた別の質問に基づいて、もう1つの要件があります( 質問 )。txtファイルを連結し、すべてのファイルの上に2行を追加するためのバッチファイルがあります(1つは書き込み用です)拡張子のないファイル名と、連結ファイルに関連付けられた日付を書き込むためのその他のファイル)。以下のバッチファイルを変更して、.txtファイルを日付変更順に連結し、各ファイルの上に2行追加してください。

@echo off
SETLOCAL
for /r %%f in (*.txt) do (
echo File Name   : %%~nf 
FOR /f %%d IN ("%%~tf") DO echo Date        : %%d
echo.
type "%%f"
) >> output_text.doc

GOTO :EOF

すべての問題は最終的なバッチファイルを解決しました:

@echo off
setlocal enableextensions disabledelayedexpansion

set "root=%cd%"

>"output.doc" (
    for /f "tokens=1,2,*" %%a in ('
        robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
        ^| sort 
    ') do (
     echo( %%~nc
     for /f "tokens=1-3 delims=/" %%d in ("%%a") do echo %%f/%%e/%%d
     type "%%~fc"
    )
)
3
CodeIt
@echo off
    setlocal enableextensions disabledelayedexpansion

    set "root=%cd%"

    >"output.doc" (
        for /f "tokens=2,*" %%a in ('
            robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
            ^| sort 
        ') do type "%%~fb"
    )

これは、robocopyを使用して、指定されたルートフォルダーの下にあるすべての.txtファイルのリストを取得します。

ファイルのリストは、ファイルの最終変更日を含めて生成されます。 robocopyはUTC時刻をyyyy/mm/dd hh:mm:ss形式で出力するため、リストを適切に並べ替えることができます。

コードの残りの部分は、最終的なリストを処理し、ファイル参照を取得して入力するためのfor /fコマンドです。処理された各ファイルの開閉操作を回避するために、完全なコマンドが出力ファイルにリダイレクトされます。

編集済み最終出力にファイル名とタイムスタンプを含める必要があるため...

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "root=%cd%"

    >"output.doc" (
        for /f "tokens=1,2,*" %%a in ('
            robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
            ^| sort 
        ') do (
            echo(%%~nc
            echo(%%a %%b [%%~tc]
            type "%%~fc"
        )
    )

tokens句が変更されてrobocopyからタイムスタンプを取得するようになり、出力に含めることができるようになりました。 %%aは日付、%%b時刻、%%cはフルパスのファイル名を保持します。

ファイルごとに、最初に拡張子なしのファイル名(%%~nc)がエコーされ、次にrobocopyタイムスタンプがエコーされ、robocopyの出力がUTC時間であるため、ファイルのタイムスタンプ( %%~tc)。次に、ファイルが入力されます。

以前と同様に、すべての出力は最終ファイルにリダイレクトされます。

1
MC ND

Powershell(3-注を参照)1つのライナー:

gci *.txt -Recurse -File |sort -Property LastWriteTime |% {(gc $_) + "`n"} >output.doc

  • 最初に一致するすべてのファイルが一覧表示されます(gci
  • 次に、それらを変更日で並べ替えます(sort
  • 次に、ファイルの内容を取得し、それぞれに改行を追加します(gc
  • そして最後にすべてを出力ファイルに書き込みます。

注:ps3で導入された_-File_を使用しているため。これはPs2構文で書き直すことができますが、より冗長です。

編集: OPの要求に応じて:{(gc $ _)+ "` n "}を次のように変更します:

{"$($_.basename)`n$(get-date -u %d/%m/%Y $_.lastwritetime)`n$(gc $_)`n"}


(今回はさまざまなオプションを表示するために文字列補間を使用しました)

補足:[可能性のある]ファイルエンコーディングの不整合と問題は処理されません。


2
wmz
for /f "delims=:" %f in ('dir *.txt /O:D /T:W /B') do @echo %f

このコマンドは、dirを使用して、最後に書き込まれた日付(/O:D)とベアフォーマット(/T:W)を使用して、古い日付から新しい日付(/B)で並べ替え、ファイル名。 delimsコマンドでfor:に設定すると、ファイル名に:が許可されていないため、スペースまたはコンマに基づいてファイル名を解析しようとしなくなります。

1
Klaatu