ディレクトリ構造をコピーするが、特定のファイルのみを含める方法(Windowsバッチファイルを使用)


103

タイトルのとおり、ディレクトリ構造を再帰的にコピーして、一部のファイルのみを含めるにはどうすればよいですか。たとえば、次のディレクトリ構造があるとします。

folder1
  folder2
    folder3
      data.zip
      info.txt
      abc.xyz
    folder4
    folder5
      data.zip
      somefile.exe
      someotherfile.dll

ファイルdata.zipおよびinfo.txtは、ディレクトリ構造のどこにでも表示できます。ディレクトリ構造全体をコピーするにはどうすればよいですか。ただし、data.zipおよびinfo.txtという名前のファイルのみを含めます(他のすべてのファイルは無視する必要があります)?

結果のディレクトリ構造は次のようになります。

copy_of_folder1
  folder2
    folder3
      data.zip
      info.txt
    folder4
    folder5
      data.zip

回答:


169

バッチのみである必要があるかどうかは言及していませんが、を使用できる場合はROBOCOPY、これを試してください。

ROBOCOPY C:\Source C:\Destination data.zip info.txt /E

編集:空のフォルダーを含める/Sよう/Eにパラメーターを変更しました。


この構文で* .zipをコピーできますか?data.zipの代わりに* .zipとだけ書いてみましたが、ファイルはコピーされず、フォルダーのみがコピーされました。私も?.zipを試しました
Niels Brinch

@Niels Brinchはい、それができるはずです。あなたが使用している正確なコマンドラインは何ですか?
失神

1
ROBOCOPY C:\ Source C:\ Destination * .zip / E
Niels Brinch

変だ。どのOSを使用していますか?必要なファイル/フォルダーの権限がありますか?私はWin 7でテストして、*.zipうまくいきました。
失神2012

本当に!?私はWin 7も使用しています。試しても、ファイルがコピーされません。フォルダのみ。もう一度やってみます。。レッツ* .zipファイルと* .jpgの言う-私たちはそれでいる間(、構文は* .zipファイルにはより多く含まれるようにするものである
ニールスBrinch

29

一度に1つのファイルをコピーし、ROBOCOPYを必要としない代替ソリューション:

@echo off
setlocal enabledelayedexpansion

set "SOURCE_DIR=C:\Source"
set "DEST_DIR=C:\Destination"
set FILENAMES_TO_COPY=data.zip info.txt

for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
    if exist "%%F" (
        set FILE_DIR=%%~dpF
        set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
        xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
    )
)

外側のforステートメントは、のサブディレクトリSOURCE_DIRとの名前の可能なパスの組み合わせを生成しFILENAMES_TO_COPYます。既存のファイルごとにxcopyが呼び出されます。で作成する必要FILE_INTERMEDIATE_DIRのあるファイルのサブディレクトリパスを保持します。SOURCE_DIRDEST_DIR


1
フォルダとサブフォルダからすべての写真をコピーする必要がありました。このバッチスクリプトが役に立ちました。set FILENAMES_TO_COPY=data.zip info.txt上記の行を次のように変更しましたset FILENAMES_TO_COPY=*.jpg
Kai Noack

ファイルパスにスペースが含まれているため、エラーが発生します(SOURCE_DIR = "C:\ Origin Test"、DEST_DIR = "C:\ Dest Test"、エラー:Test ""は現時点では予期されていませんでした)。%var%を!varで変更しようとしました!どこでも、成功せず。これを解決する方法についての手がかりはありますか?構造全体は、スペースを含むフォルダ名でいっぱいです。
ricardo.scholz

1
試してみてくださいset "SOURCE_DIR=C:\Origin Test"set "DEST_DIR=C:\Dest Test"。二重引用符の配置に注意してください。
サクラ

13

findの出力(つまり、ファイルパス)をcpioにパイプしてみます

find . -type f -name '*.jpg' | cpio -p -d -v targetdir/

cpioはターゲットファイルのタイムスタンプをチェックします-そのため、安全で高速です。

慣れてきたら-vを削除してより高速な操作を行います。


2
@Christianは、標準インストールの一部ではないcpioに依存しています。
Crashworks、2014年

8

Powershellがオプションの場合、これを行うことができます:

Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurse

主な欠点は、指定したフィルターに一致するファイルがないためにフォルダーが空になる場合でも、すべてのフォルダーをコピーすることです。したがって、必要なファイルを含むいくつかのフォルダーに加えて、空のフォルダーでいっぱいのツリーになる可能性があります。


これをもう一度実行すると、宛先が変更されます。(ファイルをサブフォルダーに入れます。)私に尋ねると、ばかげた振る舞いです。rm -r -ErrorAction:SilentlyContinue d:\destinationPathコピーする前に実行して修正してください。
MakotoE

7

以前の回答に感謝します。:)

「r4k4copy.cmd」という名前のスクリプト:

@echo off
for %%p in (SOURCE_DIR DEST_DIR FILENAMES_TO_COPY) do set %%p=
cls
echo :: Copy Files Including Folder Tree
echo :: http://stackoverflow.com
rem     /questions/472692/how-to-copy
rem     -a-directory-structure-but-only
rem     -include-certain-files-using-windows
echo :: ReScripted by r4k4
echo.
if "%1"=="" goto :NoParam
if "%2"=="" goto :NoParam
if "%3"=="" goto :NoParam
setlocal enabledelayedexpansion
set SOURCE_DIR=%1
set DEST_DIR=%2
set FILENAMES_TO_COPY=%3
for /R "%SOURCE_DIR%" %%F IN (%FILENAMES_TO_COPY%) do (
if exist "%%F" (
set FILE_DIR=%%~dpF
set FILE_INTERMEDIATE_DIR=!FILE_DIR:%SOURCE_DIR%=!
xcopy /E /I /Y "%%F" "%DEST_DIR%!FILE_INTERMEDIATE_DIR!"
)
)
goto :eof
:NoParam
echo.
echo Syntax: %0 [Source_DIR] [Dest_DIR] [FileName]
echo Eg.   : %0 D:\Root E:\Root\Lev1\Lev2\Lev3 *.JPG
echo Means : Copy *.JPG from D:\Root to E:\Root\Lev1\Lev2\Lev3

「Source」、「Destination」、「FileName」の変数を受け入れます。また、指定したタイプのファイルまたは選択したファイル名のみをコピーできます。

どんな改善も歓迎します。:)


5

検索とcpのみ:

mkdir /tmp/targetdir
cd sourcedir
find . -type f -name '*.zip' -exec cp -p --parents {} /tmp/targetdir ";"
find . -type f -name '*.txt' -exec cp -p --parents {} /tmp/targetdir ";"

4

パウリウスのソリューションに似ていますが、気にしないファイルはコピーされず、削除されません。

@echo OFF

:: Replace c:\temp with the directory where folder1 resides.
cd c:\temp

:: You can make this more generic by passing in args for the source and destination folders.
for /f "usebackq" %%I in (`dir /b /s /a:-d folder1`) do @echo %%~nxI | find /V "data.zip" | find /v "info.txt" >> exclude_list.txt
xcopy folder1 copy_of_folder1 /EXCLUDE:exclude_list.txt /E /I

4

すべてのテキストファイルをG:にコピーし、ディレクトリ構造を保持するには:

xcopy *.txt /s G:

これは、サブフォルダーからすべての.txtをコピーし、ベースディレクトリに対するディレクトリ構造を維持するように、再帰的に機能しますか?
ミカ

3

これは単純な2つのコマンドにすぎませんが、コピーする必要のないファイルが小さい場合を除いて、これはお勧めしません。これは、すべてのファイルをコピーしてから、コピーに不要なファイルを削除するためです。

xcopy /E /I folder1 copy_of_folder1
for /F "tokens=1 delims=" %i in ('dir /B /S /A:-D copy_of_files ^| find /V "info.txt" ^| find /V "data.zip"') do del /Q "%i"

確かに、2番目のコマンドは少し長いですが、機能します!

また、このアプローチでは、サードパーティのツールをダウンロードしてインストールする必要はありません(Windows 2000+ BATCHには、これに十分なコマンドがあります)。


どうもありがとう。あなたが言ったように、(私の場合)コピーする必要のあるファイルは通常小さいですが、コピーしてはならないファイルは大きい(そしてそれらがたくさんあるかもしれません)ので、それは理想的ではありません。
M4N 2009年

2

Linuxおよびその他のUNIXシステムでは、tarコマンドを使用すると簡単にこれを実行できます。

$ tar cvf /tmp/full-structure.tar *data.zip *info.txt

次に、ターゲットにcwdし、次のようにします。

$ tar xvf /tmp/full-structure.tar 

もちろん、最初のtarから2番目のtarへの出力をパイプ処理することもできますが、段階的に機能することを理解するのも説明するのも簡単です。次のコマンドに必要なcd / to / new / path /がありません-方法を思い出せません。うまくいけば、他の誰かがそれを追加できます。

$ tar cvf -  *data.zip *info.txt |  tar xvf - 

Tar(gnutar)はWindowsでも利用できますが、おそらくxcopyそのプラットフォームで自分でメソッドを使用します。


tar cvf /tmp/full-structure.tar ** / data.zip ** / info.txtが機能しました
ssinganamalla

「tar cvf /tmp/full-structure.tar ** / data.zip ** / info.txt」と「tar cvf /tmp/full-structure.tar * data.zip * info.txt」の両方で3つのエラーが発生しました:(1) "tar:* data.zip:統計できません:そのようなファイルまたはディレクトリはありません"、(2) "tar * info.txt:統計できない:そのようなファイルまたはディレクトリはありません"、(3) "tar:で終了します以前のエラーによる障害ステータス」。whcihフォルダから、これをすべて実行できますか?この方法がわかりません。
user1271772

質問はWINDOWS
Anfelipe

Win10にはWSLがあり、これが有効になります。tarはWindows上で20年以上利用可能であり、パイプの使用はMS-DOSの時代から機能しています。どのシェル環境でも、PWDは重要です。PWD-現在の作業ディレクトリ。私はこのソリューションがエンドユーザーにとってより少なく、パワーユーザーやプログラマーにとってより多くであることを認めます。
JohnP

1
XCOPY /S folder1\data.zip copy_of_folder1  
XCOPY /S folder1\info.txt copy_of_folder1

編集:空のフォルダーを保持したい場合(投稿を再読み込みすると、/ Sの代わりに/ Eを使用すると思われます)。


1
フォルダー構造は保持されません。
パウリウス

/ Eオプションは、必要に応じて空のフォルダーを作成するなど、フォルダー構造を維持します。ファイル名はワイルドカードでも使用できます(例:folder1 \ *。zip)。存在しない完全なファイル名を渡すと、「ファイルが見つかりません」というエラーのみが表示されます(この場合、「ファイルが見つかりません-xxx.xxx 0ファイルがコピーされました」と表示されます。パターンを指定すると、ファイルが返されない場合(たとえば、folder1 \ *。zzz)、「0 File(* s)
copyed

1

WinRARコマンドラインインターフェースを使用して、ファイル名やファイルタイプをアーカイブにコピーできます。次に、そのアーカイブを好きな場所に抽出できます。これにより、元のファイル構造が保持されます。

音楽自体を再コピーせずに、不足しているアルバム画像ファイルを携帯電話に追加する必要がありました。幸い、ディレクトリ構造は私のコンピュータとモバイルで同じでした!

私が使用した:

   rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
  • C:\ Downloads \ music.rar =作成するアーカイブ
  • X:\ music \ =音楽ファイルを含むフォルダー
  • Folder.jpg =コピーしたいファイル名

これにより、適切なサブディレクトリにすべてのFolder.jpgファイルを含むアーカイブが作成されました。

この手法は、ファイルタイプのコピーにも使用できます。ファイルの名前がす​​べて異なる場合は、すべてのファイルを単一のディレクトリに抽出することを選択できます。追加のコマンドラインパラメータは、複数のファイルタイプをアーカイブできます。

この非常に役立つリンクhttp://cects.com/using-the-winrar-command-line-tools-in-windows/の詳細情報


1

使用する人のためにAltapサラマンダー(2枚のパネルファイルマネージャ):コピーポップアップのオプションでは、単にファイル名またはマスクを指定します。簡単です。


0

私は正規表現で問題なく、インストールが面倒で嫌いなので、ディレクトリを作成してバニラDOSコマンドでコピーするバッチファイルを作成しました。面倒ですが、ロボコピーをするよりも私には速いようです。

  1. 完全なパスを含むソースファイルのリストを作成します(necの場合はドライブ文字を含む)。テキストファイルに作成します。
  2. テキストエディタで正規表現をオンにします。
  3. スペースの場合は各行を二重引用符で囲みます-検索文字列は文字列を(.*)置き換えます"\1"、すべて置換をクリックします
  4. ファイルごとに2行を作成します-1つはディレクトリを作成し、もう1つはファイルをコピーします(qqqは宛先パスで置き換えられます)-検索文字列(.*)置換文字列md qqq\1\nxcopy \1 qqq\1\nを置換し、すべて置換をクリックします
  5. 宛先パスからファイル名を削除–検索\\([^\\^"]+)"\n置換\\"\n
  6. 宛先パスを置き換えます(この例A:\srcとではB:\dest)。正規表現をオフにし、qqq"A:\src\置換B:\dest\を検索して、すべて置換をクリックします。

mdはネストされたディレクトリを作成します。この例では、copyはおそらくxcopyと同じように動作します。/ Yをxcopyに追加して、上書き確認を抑制できます。次のようなバッチファイルが作成されます。

md "B:\dest\a\b\c\"
xcopy "C:\src\a\b\c\e.xyz" "B:\dest\a\b\c\e.xyz"

元のリストのすべてのファイルに対して繰り返されます。Win7でテスト済み。


-1

ドラッグアンドドロップでこれを行うには、winzipを使用します。dir構造の保存オプションがあります。ルートとなるディレクトリレベルで新しい.zipを作成し、ファイルをドラッグします。


おかげで、私はスクリプト(バッチ)ファイルから使用するソリューションを探していました。したがって、ドラッグアンドドロップは必要ありません...
M4N
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.