Как скопировать структуру каталогов, но включить только определенные файлы (используя пакетные файлы Windows)
Как видно из названия, как я могу рекурсивно копировать структуру каталогов, но включать только некоторые файлы. Например, учитывая следующую структуру каталогов:
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
Ответы
Ответ 1
Вы не указываете, должна ли она быть только пакетной, но если вы можете использовать ROBOCOPY
, попробуйте следующее:
ROBOCOPY C:\Source C:\Destination data.zip info.txt /E
EDIT: изменил параметр /S
на /E
, чтобы включить пустые папки.
Ответ 2
Альтернативное решение, которое копирует один файл за раз и не требует 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
.
Ответ 3
попробуйте выполнить вывод вывода find (т.е. путь к файлу) в cpio
find . -type f -name '*.jpg' | cpio -p -d -v targetdir/
cpio проверяет временную метку на целевых файлах - так что это безопасно и быстро.
удалите -v для более быстрого op, как только вы привыкнете к нему.
Ответ 4
Спасибо за предыдущие ответы.:)
Этот script с именем "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
Он принимает переменную "Источник", "Целевое назначение" и "Имя файла".
Он также может копировать только указанные типы файлов или выборочные имена файлов.
Любые улучшения приветствуются.:)
Ответ 5
Если опция Powershell является опцией, вы можете сделать это:
Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurse
Основным недостатком является копирование всех папок, даже если они будут пустыми, потому что никакие файлы не соответствуют указанному фильтру. Таким образом, вы можете получить дерево, полное пустых папок, в дополнение к нескольким папкам, в которых есть нужные файлы.
Ответ 6
Только для поиска и 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 ";"
Ответ 7
Аналогично решению 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
Ответ 8
Это всего две простые команды, но я бы не рекомендовал этого, если файлы, которые вам НЕ нужно копировать, невелики. Это потому, что это скопирует ВСЕ файлы, а затем удалит файлы, которые не нужны в копии.
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 для этого достаточно команд).
Ответ 9
В Linux и других UNIX-системах использование команды tar
сделает это легко.
$ tar cvf /tmp/full-structure.tar *data.zip *info.txt
Затем вы должны перейти к цели и:
$ tar xvf /tmp/full-structure.tar
Конечно, вы могли бы вывести вывод из первого tar во второй, но увидеть его работу в шагах легче понять и объяснить. Мне не хватает необходимого cd/to/new/path/в следующей команде - я просто не помню, как это сделать сейчас. Кто-то может добавить его, надеюсь.
$ tar cvf - *data.zip *info.txt | tar xvf -
Tar (gnutar) также доступен в Windows, но я бы, вероятно, использовал метод xcopy
на этой платформе.
Ответ 10
XCOPY /S folder1\data.zip copy_of_folder1
XCOPY /S folder1\info.txt copy_of_folder1
РЕДАКТИРОВАТЬ: Если вы хотите сохранить пустые папки (которые при перечитывании вашего сообщения, как вам кажется), используйте /E вместо/S.
Ответ 11
Для тех, кто использует Altap Salamander (файловый менеджер с 2 панелями): во всплывающем окне "Параметры" просто укажите имена файлов или маски. Легко.
Ответ 12
Используя интерфейс командной строки 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/
Ответ 13
Я отлично разбираюсь в регулярных выражениях, ленив и не готов к установке, поэтому создал пакетный файл, который создает каталог и копирует с помощью ванильных DOS-команд. Кажется трудоемким, но быстрее для меня, чем разработка robocopy.
- Создайте список исходных файлов с полными путями, включая букву диска, если нет, в текстовом файле.
- Включите регулярные выражения в текстовом редакторе.
- Добавить двойные кавычки вокруг каждой строки в случае пробелов - строка поиска
(.*)
заменить строку "\1"
и нажать "заменить все"
- Создайте две строки для каждого файла - один для создания каталога, один для копирования файла (qqq будет заменен на путь назначения) - строка поиска
(.*)
заменить строку md qqq\1\nxcopy \1 qqq\1\n
и нажать "заменить все"
- Удалите имя файла из целевых путей - выполните поиск
\\([^\\^"]+)"\n
replace \\"\n
- Замените путь назначения (в этом примере
A:\src
и B:\dest
). Выключите регулярные выражения, найдите qqq"A:\src\
замените B:\dest\
и нажмите "заменить все" .
md создаст вложенные каталоги. копия, вероятно, будет вести себя одинаково с 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.
Ответ 14
Чтобы сделать это с помощью drag and drop, используйте winzip там параметр сохранения структуры dir. Просто создайте новый .zip на уровне каталога, который будет вашим корнем и перетащите файлы.
Ответ 15
Чтобы скопировать все текстовые файлы в G: и сохранить структуру каталогов:
xcopy *.txt /s G: