116

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

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
4

15 に答える 15

185

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

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

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

于 2009-01-23T12:25:12.560 に答える
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!"
    )
)

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

于 2009-07-09T14:48:23.083 に答える
16

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

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

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

慣れたら -v を削除して、操作を高速化します。

于 2012-12-18T20:40:52.267 に答える
11

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

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

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

于 2015-03-16T17:12:50.550 に答える
10

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

xcopy *.txt /s G:
于 2018-02-28T21:18:55.570 に答える
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」の変数を受け入れます。また、指定されたタイプのファイルまたは選択したファイル名のみをコピーすることもできます。

どんな改善でも大歓迎です。:)

于 2011-11-10T04:26:50.137 に答える
6

find と 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 ";"
于 2014-01-09T15:34:49.247 に答える
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
于 2009-01-23T14:10:38.183 に答える
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 には、このための十分なコマンドがあります)。

于 2009-01-23T13:33:55.497 に答える
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そのプラットフォームではおそらく自分でこの方法を使用するでしょう。

于 2013-04-18T14:56:00.317 に答える
1
XCOPY /S folder1\data.zip copy_of_folder1  
XCOPY /S folder1\info.txt copy_of_folder1

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

于 2009-01-23T12:32:03.250 に答える
1

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

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

私が使用した:

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

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

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

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

于 2016-01-20T16:41:06.450 に答える
0

私は正規表現に問題がなく、怠け者でインストールを嫌うので、ディレクトリを作成し、通常の DOS コマンドでコピーするバッチ ファイルを作成しました。骨の折れるようですが、ロボコピーを実行するよりも速いです。

  1. 必要な場合はドライブ文字を含む完全なパスを含むソース ファイルのリストをテキスト ファイルに作成します。
  2. テキスト エディターで正規表現を有効にします。
  3. スペースがある場合は各行を二重引用符で囲みます - search string (.*)replace string"\1"を選択し、 replace all をクリックします
  4. ファイルごとに 2 つの行を作成します - 1 つはディレクトリを作成し、もう 1 つはファイルをコピーします (qqq はコピー先パスに置き換えられます) - 検索文字列は文字列を(.*)置換md qqq\1\nxcopy \1 qqq\1\nし、[すべて置換] をクリックします
  5. 宛先パスからファイル名を削除します – 検索\\([^\\^"]+)"\n置換\\"\n
  6. 宛先パスを置き換えます (この例ではA:\srcB:\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でテスト済み。

于 2015-02-22T22:58:42.867 に答える
-1

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

于 2011-09-10T11:10:41.040 に答える