M4N*_*M4N 94 windows cmd batch-file robocopy
正如标题所说,我如何递归复制目录结构,但只包含一些文件.例如,给定以下目录结构:
folder1
folder2
folder3
data.zip
info.txt
abc.xyz
folder4
folder5
data.zip
somefile.exe
someotherfile.dll
Run Code Online (Sandbox Code Playgroud)
文件data.zip和info.txt可以出现在目录结构的任何地方.如何复制完整的目录结构,但只包含名为data.zip和info.txt的文件(应忽略所有其他文件)?
生成的目录结构应如下所示:
copy_of_folder1
folder2
folder3
data.zip
info.txt
folder4
folder5
data.zip
Run Code Online (Sandbox Code Playgroud)
aph*_*ria 159
你没有提到它是否必须只是批量,但如果你可以使用ROBOCOPY,试试这个:
ROBOCOPY C:\Source C:\Destination data.zip info.txt /E
Run Code Online (Sandbox Code Playgroud)
编辑:将/S参数更改/E为包含空文件夹.
sak*_*kra 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!"
)
)
Run Code Online (Sandbox Code Playgroud)
outer for语句生成子目录in SOURCE_DIR和name in的任何可能的路径组合FILENAMES_TO_COPY.对于每个现有文件,都会调用xcopy.FILE_INTERMEDIATE_DIR保存文件的子目录路径,在SOURCE_DIR该路径中需要创建DEST_DIR.
Gab*_*bow 13
尝试将find的输出(即文件路径)输入到cpio中
find . -type f -name '*.jpg' | cpio -p -d -v targetdir/
Run Code Online (Sandbox Code Playgroud)
cpio检查目标文件的时间戳 - 所以它安全快速.
一旦你习惯了,就删除-v以获得更快的操作.
小智 9
将所有文本文件复制到 G: 并保留目录结构:
xcopy *.txt /s G:
Run Code Online (Sandbox Code Playgroud)
如果选择Powershell,您可以这样做:
Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurse
Run Code Online (Sandbox Code Playgroud)
主要的缺点是它复制所有文件夹,即使它们最终都是空的,因为没有文件与您指定的过滤器匹配.因此,除了包含所需文件的少数文件夹之外,您最终还是会得到一个装满空文件夹的树.
感谢以前的答案.:)
这个脚本名为"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
Run Code Online (Sandbox Code Playgroud)
它接受"Source","Destination"和"FileName"的变量.它还只能复制指定类型的文件或选择性文件名.
欢迎任何改进.:)
仅使用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 ";"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
179264 次 |
| 最近记录: |