Скопировать несколько файлов, перечисленных в текстовом файле, в новую папку.

Вопрос или проблема

Мне нужно скопировать несколько файлов, перечисленных в текстовом файле, в новую папку. Я не мастер компьютеров, так что, пожалуйста, будьте аккуратны и упростите это 🙂

(Имена файлов выглядят примерно так: 201609-ABCD.pdf)

Я думаю, что нижеописанное может сработать, но не знаю, как это запустить.

{
Итерация по текстовому файлу:

for /f “delims=” %%L in (foo.txt) do
Копирование файлов:

copy “%%L” new_folder
Готово:

for /f “delims=” %%L in (foo.txt) do copy “%%L” new_folder
}

  • Если исходная папка, папка назначения и список файлов находятся под одним путем:
FileList:          D:\Files\FileList.txt
SourceFolder:      D:\Files\SourceFolder
DestinationFolder: D:\Files\DestinationFolder

И список файлов содержит только имя и расширение файлов:

File1.txt
File2.pdf
File3.docx
File4.jpg

Тогда ваш скрипт будет таким:

@echo off
pushd D:\Files
for /f "tokens=* delims=" %%a in ('type FileList.txt') do xcopy /hrkvy ".\SourceFolder\%%a" ".\DestinationFolder"
popd
pause
  • Если исходная папка, папка назначения и список файлов находятся под одним путем:
FileList:          D:\Files\FileList.txt
SourceFolder:      D:\Files\SourceFolder
DestinationFolder: D:\Files\DestinationFolder

И список файлов содержит полный путь к файлам:

D:\Files\SourceFolder\File1.txt
D:\Files\SourceFolder\File2.jpg
D:\Files\SourceFolder\File3.docx

Тогда ваш скрипт будет таким:

@echo off
pushd D:\Files
for /f "tokens=* delims=" %%a in ('type FileList.txt') do xcopy /hrkvy "%%a" ".\DestinationFolder"
popd
pause
  • Если папка назначения и список файлов находятся под одним путем, а исходная папка является переменной:
FileList:          D:\Files\FileList.txt
SourceFolder:      %SourceFolder%
DestinationFolder: D:\Files\DestinationFolder

И список файлов содержит только имя и расширение файлов:

File1.txt
File2.jpg
File3.docx

Тогда ваш скрипт будет таким:

@echo off
pushd D:\Files
set /p SourceFolder=Введите путь к исходной папке и нажмите 'Enter':
cls
for /f "tokens=* delims=" %%a in ('type FileList.txt') do xcopy /hrkvy "%SourceFolder%\%%a" ".\DestinationFolder"
popd
pause
  • Если папка назначения и список файлов находятся под разными путями:
FileList:          D:\Files\FileList.txt
DestinationFolder: C:\DestinationFolder

И список файлов указывает на файлы в разных местах:

D:\Files\File1.txt
C:\WorkFiles\File2.jpg
E:\File3.docx

Тогда ваш скрипт будет таким:

@echo off
for /f "tokens=* delims=" %%a in ('type "D:\Files\FileList.txt"') do xcopy /hrkvy "%%a" "C:\DestinationFolder"
pause
  • Если папка назначения и список файлов находятся под разными путями, а исходная папка является переменной:
FileList:          D:\Files\FileList.txt
SourceFolder:      %SourceFolder% 
DestinationFolder: C:\DestinationFolder

И список файлов содержит только имя и расширение файлов:

File1.txt
File2.jpg
File3.docx

Тогда ваш скрипт будет таким:

@echo off
set /p SourceFolder=Введите путь к исходной папке и нажмите 'Enter':
cls
for /f "tokens=* delims=" %%a in ('type "D:\Files\FileList.txt"') do xcopy /hrkvy "%SourceFolder%\%%a" "C:\DestinationFolder"
pause

Обновление:

Для рекурсивного обхода подпапок OneDrive, чтобы найти исходные файлы:

@echo off
pushd D:\Missing Papers
for /f "tokens=* delims=" %%a in ('type MissingPapers.txt"') do (
 for /f "tokens=* delims=" %%b in ('dir /b /s "%OneDrive%" ^| find /i "%%a"') do
  xcopy /hrkvy "%%b" ".\Searched out"
 )
)
pause
  • Вставьте это в файл .txt и переименуйте его расширение в .cmd, затем запустите его.

  • Если у вас нет прав на чтение из исходного каталога или прав на запись в папку назначения, запустите сценарий от имени администратора.

  • Не забудьте заменить примеры на реальные пути к файлам.

Исходя из ответа @NetwOrchestration, у меня был больший успех, используя robocopy вместо xcopy. Robocopy кажется более надежным и имеет простой встроенный функционал для переноса файла из источника в назначение, имея только имя файла. Посмотрите этот пост, чтобы понять, что я имею в виду.

Это работает только тогда, когда список файлов содержит только имена файлов, без путей. Robocopy принимает только имя файла, ищя его в папке, которую вы указали как исходную папку. Поэтому файл .txt со списком файлов должен выглядеть как-то так:

MyFile1.bin
MyFile2.txt
MyFile4.doc

Код для моего .bat решения, которое позволяет вам передавать путь к .txt с списком файлов, исходную папку и папку назначения в качестве аргументов:

@ECHO off
SET FileListTxt=%~1
SET SourceFolder=%~2
SET DestinationFolder=%~3

for /f "tokens=* delims=" %%a in ('type "%FileListTxt%"') do robocopy "%SourceFolder%" "%DestinationFolder%" "%%a"

ECHO ГОТОВО КОПИРОВАНИЕ ФАЙЛОВ В %FileListTxt% ИЗ %SourceFolder% В %DestinationFolder%

Попробуйте использовать этот скрипт с cygwin https://github.com/ekardian/dryncs

Вы можете сериализовать все ваши файлы с помощью программы, найдя её в интернете. Этот скрипт был полезен, а также есть другие варианты в тех репозиториях для копирования с множества ПК на одну флешку, все перечисленные в текстовом файле.

.

Ответ или решение

Конечно, давайте разберем, как скопировать несколько файлов, указанных в текстовом файле, в новую папку с использованием Windows-командной строки. Этот процесс можно автоматизировать с помощью сценария на файле batch, что особенно удобно, если вам нужно работать с несколькими файлами одновременно. Давайте рассмотрим несколько случаев использования и соответствующие сценарии.

Описание задачи

Вы хотите скопировать файлы, указанные в текстовом файле (FileList.txt), в новую папку (DestinationFolder). Эти файлы могут находиться в одной папке (SourceFolder) или быть распределены по различным каталогам. Ваш текстовый файл содержит только названия файлов или полные пути к ним.

Решение

Сценарий 1: Файл содержит только названия файлов, а папки расположены в одном каталоге

Настройки:

  • FileList.txt находится в D:\Files\
  • SourceFolder находится в D:\Files\SourceFolder
  • DestinationFolder находится в D:\Files\DestinationFolder

Сценарий:

@echo off
pushd D:\Files
for /f "tokens=* delims=" %%a in ('type FileList.txt') do xcopy /hrkvy ".\SourceFolder\%%a" ".\DestinationFolder"
popd
pause

Сценарий 2: Файл содержит полные пути к файлам

Настройки:

  • FileList.txt находится в D:\Files\
  • DestinationFolder находится в D:\Files\DestinationFolder

Сценарий:

@echo off
for /f "tokens=* delims=" %%a in ('type "D:\Files\FileList.txt"') do xcopy /hrkvy "%%a" "D:\Files\DestinationFolder"
pause

Сценарий 3: Использование переменной для папки

Если вы хотите иметь возможность указывать папку источника через переменную, например, если она может меняться, это можно сделать следующим образом:

@echo off
set /p SourceFolder=Введите путь к исходной папке и нажмите 'Enter':
cls
for /f "tokens=* delims=" %%a in ('type "D:\Files\FileList.txt"') do xcopy /hrkvy "%SourceFolder%\%%a" "C:\DestinationFolder"
pause

Замена xcopy на robocopy для повышения надежности

Robocopy является более надежным инструментом для копирования файлов и рекомендуется для использования. Если ваш список файлов включает в себя только названия файлов, применять robocopy легко:

Сценарий:

@ECHO off
SET FileListTxt=%~1
SET SourceFolder=%~2
SET DestinationFolder=%~3

for /f "tokens=* delims=" %%a in ('type "%FileListTxt%"') do robocopy "%SourceFolder%" "%DestinationFolder%" "%%a"

ECHO DONE COPYING FILES IN %FileListTxt% FROM %SourceFolder% TO %DestinationFolder%

Этот скрипт позволяет вам передавать файл со списком, папку источника и папку назначения в командной строке как аргументы. Это делает ваше решение более гибким и адаптируемым к различным сценариям.

Заключение

Использование командной строки и написание скриптов batch может значительно облегчить обработку файлов. Обязательно убедитесь, что у вас есть соответствующие права доступа для чтения из файлов источника и записи в папку назначения. Настройка сценария под ваши нужды позволит эффективно копировать файлы, минимизируя ручную работу. Если у вас есть вопросы или требуется дальнейшая помощь, не стесняйтесь обращаться.

Надеюсь, это поможет вам успешно справиться с поставленной задачей!

Оцените материал
Добавить комментарий

Капча загружается...