コピーする方法は以下のようになディレクトリ構造も含む特定のファイル(windowsバッチファイル)
-
19-08-2019 - |
質問
タイトルどうしたいので再帰的にコピーするコピーを作成してディレクトリ構造がみなどの一部のファイルです。例では、以下のディレクトリ構造
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
解決
バッチのみにする必要があるかどうかは言及しませんが、ROBOCOPY
を使用できる場合は、これを試してください:
ROBOCOPY C:\Source C:\Destination data.zip info.txt /E
編集:/S
パラメーターを/E
に変更して、空のフォルダーを含めます。
他のヒント
一度に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
は、DEST_DIR
内に作成する必要がある<=>内のファイルのサブディレクトリパスを保持します。
findの出力(ファイルパスなど)をcpioにパイピングします
find . -type f -name '*.jpg' | cpio -p -d -v targetdir/
cpioはターゲットファイルのタイムスタンプをチェックするため、安全かつ高速です。
慣れると、-vを削除して操作を高速化します。
Powershellがオプションの場合、これを行うことができます:
Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurse
主な欠点は、指定したフィルターに一致するファイルがないためにすべてが空になってもすべてのフォルダーがコピーされることです。そのため、必要なファイルがあるいくつかのフォルダーに加えて、空のフォルダーでいっぱいのツリーになる可能性があります。
以前の回答に感謝します。 :)
<!> quot; r4k4copy.cmd <!> quot;という名前のこのスクリプト:
@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
<!> quot; Source <!> quot;、<!> quot; Destination <!> quot ;、および<!> quot; FileName <!> quot;の変数を受け入れます。 また、指定した種類のファイルまたは選択したファイル名のみをコピーできます。
どんな改善も歓迎します。 :)
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 ";"
パウリウスのソリューションに似ていますが、気にしないファイルはコピーされずに削除されます:
@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
これは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にはこれに十分なコマンドがあります)。
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
メソッドを自分で使用するでしょう。
XCOPY /S folder1\data.zip copy_of_folder1
XCOPY /S folder1\info.txt copy_of_folder1
編集:空のフォルダを保持する場合(投稿の再読み込み時に、/ Sではなく/ Eを使用するようです)
使用WinRARコマンドラインインタフェースでコピーすることができるファイル名やファイルの種類をアーカイブを展開します。そこで抽出できるアーカイブをどの位置ます。この保存のファイル構造です。
Iを追加するのに必要不足のアルバムの画像ファイルを携帯電話なrecopyの音楽そのものです。幸いなことに、ディレクトリ構造も明らかになったのと同じコンピュータやモバイル!
使用した:
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/
Altap Salamander (2パネルファイルマネージャー)を使用している場合:[コピー]ポップアップのオプションで、ファイル名またはマスクを指定するだけです。簡単。
私は正規表現、インストールが面倒で嫌いなので大丈夫なので、ディレクトリを作成してバニラDOSコマンドでコピーするバッチファイルを作成しました。面倒ですが、robocopyを使用するよりも早いようです。
- テキストファイルに、necの場合はドライブ文字を含む完全なパスでソースファイルのリストを作成します。
- テキストエディターで正規表現を有効にします。
- スペースの場合、各行に二重引用符を追加します-検索文字列
(.*)
文字列"\1"
を置換し、すべて置換 をクリックします
- ファイルごとに2行を作成-1つはディレクトリを作成し、1つはファイルをコピーします(qqqは宛先パスに置き換えられます)-検索文字列
md qqq\1\nxcopy \1 qqq\1\n
置換文字列\\([^\\^"]+)"\n
をクリックし、すべて置換をクリック - 宛先パスからファイル名を削除<!>#8211;検索
\\"\n
置換A:\src
- 宛先パスで置き換えます(この例では
B:\dest
およびqqq"A:\src\
)。正規表現をオフにし、B:\dest\
置換<=>を検索し、すべて置換をクリックします。
mdは、ネストされたディレクトリを作成します。この例では、おそらくcopyはxcopyと同じように動作します。上書き確認を抑制するには、xcopyに/ Yを追加します。バッチファイルは次のようになります。
md "B:\dest\a\b\c\"
xcopy "C:\src\a\b\c\e.xyz" "B:\dest\a\b\c\e.xyz"
元のリストのすべてのファイルに対して繰り返されます。 Win7でテスト済み。
これを行うには、ドラッグアンドドロップでwinzipを使用し、dir構造の保存オプションがあります。ルートになるディレクトリレベルで新しい.zipを作成し、ファイルをドラッグします。
すべてのテキストファイルをG:にコピーし、ディレクトリ構造を保持するには:
xcopy *.txt /s G: