正如标题所说,我如何递归复制目录结构,但只包含一些文件。例如,给出以下目录结构:
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
答案 0 :(得分:147)
您没有提及它是否必须只是批量,但如果您可以使用ROBOCOPY
,请尝试以下操作:
ROBOCOPY C:\Source C:\Destination data.zip info.txt /E
编辑:将/S
参数更改为/E
以包含空文件夹。
答案 1 :(得分:29)
另一种解决方案,一次复制一个文件,不需要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_DIR
中文件的子目录路径,该路径需要在DEST_DIR
中创建。
答案 2 :(得分:11)
尝试将find的输出(即文件路径)输出到cpio
find . -type f -name '*.jpg' | cpio -p -d -v targetdir/
cpio检查目标文件的时间戳 - 所以它安全快速。
删除-v以获得更快的操作,一旦你习惯了它。
答案 3 :(得分: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”的变量。 它也只能复制指定类型的文件或选择性文件名。
欢迎任何改进。 :)
答案 4 :(得分:7)
如果选择Powershell,您可以这样做:
Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurse
主要缺点是它复制所有文件夹,即使它们最终都是空的,因为没有文件与您指定的过滤器匹配。所以除了包含你想要的文件的几个文件夹之外,你最终可能会得到一个装满空文件夹的树。
答案 5 :(得分:5)
仅限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 ";"
答案 6 :(得分:4)
与Paulius的解决方案类似,但您不关心的文件不会被复制然后删除:
@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
答案 7 :(得分:3)
这只是两个简单的命令,但我不建议这样做,除非您不需要复制的文件很小。那是因为这将复制所有文件,然后删除副本中不需要的文件。
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"
当然,第二个命令有点长,但它有效!
此外,此方法不要求您下载和安装任何第三方工具(Windows 2000+ BATCH有足够的命令)。
答案 8 :(得分:2)
在Linux和其他UNIX系统下,使用tar
命令可以轻松完成此任务。
$ tar cvf /tmp/full-structure.tar *data.zip *info.txt
然后你会找到目标并且:
$ tar xvf /tmp/full-structure.tar
当然,您可以将第一个tar的输出传输到第二个tar,但是看到它按步骤工作更容易理解和解释。我在以下命令中缺少必要的cd / to / new / path / - 我只是不记得现在该怎么做了。其他人可以添加它,希望如此。
$ tar cvf - *data.zip *info.txt | tar xvf -
Tar(gnutar)也可以在Windows上使用,但我可能会在该平台上使用xcopy
方法。
答案 9 :(得分:1)
XCOPY /S folder1\data.zip copy_of_folder1
XCOPY /S folder1\info.txt copy_of_folder1
编辑:如果您想保留空文件夹(在重新阅读帖子时,您似乎)使用/ E而不是/ S.
答案 10 :(得分:1)
对于那些使用Altap Salamander(2个面板文件管理器)的人:在“复制”弹出窗口的“选项”中,只需指定文件名或掩码。容易。
答案 11 :(得分:1)
使用WinRAR命令行界面,您可以将文件名和/或文件类型复制到存档。然后,您可以将该存档提取到您喜欢的任何位置。这样可以保留原始文件结构。
我需要将丢失的相册图片文件添加到我的手机中,而无需重新复制音乐本身。幸运的是,我的计算机和移动设备上的目录结构是相同的!
我用过:
rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
这会在适当的子目录中创建一个包含所有Folder.jpg文件的存档。
此技术也可用于复制文件类型。如果文件都具有不同的名称,则可以选择将所有文件解压缩到单个目录中。其他命令行参数可以归档多种文件类型。
此非常有用的链接中提供了更多信息http://cects.com/using-the-winrar-command-line-tools-in-windows/
答案 12 :(得分:0)
我对正则表达式很好,懒惰和厌恶安装,所以我创建了一个批处理文件,用vanilla DOS命令创建目录和副本。对于我而言,似乎比使用机器人更费力但更快。
(.*)
替换字符串"\1"
,然后点击全部替换(.*)
替换字符串md qqq\1\nxcopy \1 qqq\1\n
并单击全部替换\\([^\\^"]+)"\n
替换\\"\n
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上测试过。
答案 13 :(得分:-1)
要使用winzip执行此操作,请使用dir结构保留选项。只需在目录级别创建一个新的.zip,它将是您的根目录并拖动文件。
答案 14 :(得分:-1)
将所有文本文件复制到G:并保留目录结构:
xcopy *.txt /s G: