Как скопировать структуру каталогов, но включать только определенные файлы (с помощью пакетных файлов windows)
Как говорит название, как я могу рекурсивно скопировать структуру каталогов, но включать только некоторые файлы. Например, учитывая следующую структуру каталогов:
folder1
folder2
folder3
data.zip
info.txt
abc.xyz
folder4
folder5
data.zip
somefile.exe
someotherfile.dll
файлы данные.молнии и информация.txt могут появиться везде в структуре каталогов. Как я могу скопировать полную структуру каталогов, но включать только файлы с именем data.ZIP и информация.txt (все остальные файлы должны быть проигнорированы)?
полученная структура каталогов должна выглядеть так это:
copy_of_folder1
folder2
folder3
data.zip
info.txt
folder4
folder5
data.zip
15 ответов:
вы не упоминаете, если это должно быть только пакет, но если вы можете использовать
ROBOCOPY, попробуйте это:ROBOCOPY C:\Source C:\Destination data.zip info.txt /Eизменить: изменил до
/Eдля включения пустых папок.
альтернативное решение, которое копирует один файл за один раз и не требует 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!" ) )оператор outer for генерирует любую возможную комбинацию пути подкаталога в
SOURCE_DIRи имяFILENAMES_TO_COPY. Для каждого существующего файла вызывается xcopy.FILE_INTERMEDIATE_DIRсодержит путь к подкаталогу файла вSOURCE_DIR, который должен быть создан вDEST_DIR.
попробуйте трубопровод вывода find(т. е. путь к файлу) в cpio
find . -type f -name '*.jpg' | cpio -p -d -v targetdir/cpio проверяет метку времени на целевых файлах - так что его безопасно и быстро.
remove-v для более быстрого op, как только вы привыкнете к нему.
Спасибо За Предыдущие Ответы. :)
этот скрипт называется " 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". Он также может копировать только указанный тип файлов или выборочные имена файлов.
любое улучшение приветствуется. :)
Если Powershell является опцией, вы можете сделать это:
Copy-Item c:\sourcePath d:\destinationPath -filter data.zip -recurseосновным недостатком является то, что он копирует все папки, даже если они в конечном итоге будут пустыми, потому что файлы не соответствуют указанному вами фильтру. Таким образом, вы можете получить дерево, полное пустых папок, в дополнение к нескольким папкам, в которых есть нужные файлы.
похоже на решение Паулиуса, но файлы, которые вам не нужны, не копируются, а затем удаляются:
@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
только с 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 ";"
Это только две простые команды, но я бы не рекомендовал это, если только файлы, которые вам не нужно копировать, не маленькие. Это потому, что это будет копировать все файлы, а затем удалить файлы, которые не нужны в копии.
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 имеет достаточно команд для этого).
XCOPY /S folder1\data.zip copy_of_folder1 XCOPY /S folder1\info.txt copy_of_folder1EDIT: Если вы хотите сохранить пустые папки (которые, при перечитывании Вашего сообщения, Вы, похоже, используете), используйте /E вместо /S.
используя интерфейс командной строки WinRAR, вы можете скопировать имена файлов и/или типы файлов в архив. Затем вы можете извлечь этот архив в любое место, которое вам нравится. При этом сохраняется исходная структура файла.
Мне нужно было добавить отсутствующие файлы изображений альбомов на свой мобильный телефон без необходимости переписывать саму музыку. К счастью, структура каталогов была такой же на моем компьютере и мобильном телефоне!
I используется:
rar a -r C:\Downloads\music.rar X:\music\Folder.jpg
- C:\Downloads\music.Рар = архивах
- X:\music\ = папка, содержащая музыкальные файлы
.jpg = имя файла, которое я хотел скопироватьэто создало архив со всеми папками.JPG файлы в соответствующих подкаталогах.
этот метод может быть использован для копирования в файл. Если все файлы имеют разные имена, вы можете извлечь все файлы в один каталог. Дополнительный параметры командной строки могут архивировать несколько типов файлов.
дополнительная информация в этой очень полезной ссылке http://cects.com/using-the-winrar-command-line-tools-in-windows/
под Linux и другими системами UNIX, используя
tarкоманда сделает это легко.$ tar cvf /tmp/full-structure.tar *data.zip *info.txtтогда вы бы cwd к цели и:
$ tar xvf /tmp/full-structure.tarконечно, вы можете передать вывод из первого tar во второй, но видеть, что он работает поэтапно, легче понять и объяснить. Мне не хватает необходимого cd /to/new/path/ в следующей команде - я просто не помню, как это сделать сейчас. Кто-то еще может добавить его, надеюсь.
$ tar cvf - *data.zip *info.txt | tar xvf -Tar (gnutar) также доступен в Windows, но я бы, вероятно, использовал
xcopyметод себя на этой платформе.
для тех, кто использует Саламандер Сайт Altap (2 panels file manager): в настройках всплывающего окна копировать просто укажите имена файлов или маски. Простой.
Я в порядке с регулярными выражениями, ленив и не люблю устанавливать, поэтому я создал пакетный файл, который создает каталог и копирует команды vanilla DOS. Кажется трудоемким, но быстрее для меня, чем разработка robocopy.
- создайте свой список исходных файлов с полными путями, включая букву диска, если nec, в текстовом файле.
- включите регулярные выражения в текстовом редакторе.
- добавить двойные кавычки вокруг каждой строки в случае пробелов - строка поиска
(.*)заменить строку"", и нажмите кнопку Заменить все- создать две строки на файл-один для создания каталога, один для копирования файла (qqq будет заменен на путь назначения) - строка поиска
(.*)заменить строкуmd qqq\nxcopy qqq\nи нажмите кнопку Заменить все- удалить имя файла из пути назначения – поиск
\([^\^"]+)"\nзаменить\"\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.
для этого с помощью перетаскивания используйте winzip есть опция сохранения структуры dir. Просто создайте новый .zip на уровне каталога, который будет вашим корнем, и перетащите файлы.
Comments