Показать полную графическую версию : Копирование файлов
cutter47
18-06-2020, 09:40
Приветствую всех, подскажите пожалуйста по такому вопросу - имеется файл -
list.txt в котором указаны названия файлов с их путями, пример:
list.txt
c:\117888\asd.txt
c:\987898\zxdfg.txt
c:\354687\asd.txt
c:\567765\rty.txt
c:\785565\asd.txt
как мне все эти файлы скопировать в нужную папку например: d:\backup\
при условии что если копируемый файл уже имеется в папке назначения, то он не перезаписывался, а копировался с новым именем, например добавляя суффикс номера файла, например asd.txt asd(1).txt asd(2).txt из примера list.txt выше.
Прошу помощи в этом, буду вам очень благодарен.
megaloman
18-06-2020, 12:26
@Echo Off
Set "TxtFile=Z:\Box_In\list.txt"
Set "BoxOut=D:\Backup"
Set /A MaxLen=3
2>nul Md "%BoxOut%"
FOR /F "usebackq delims=" %%f IN ("%TxtFile%") DO Call :AddFile "%BoxOut%" "%%f" %MaxLen%
Exit /B
:AddFile
If Not Exist %2 Exit /B 1
If Not Exist "%~1\%~nx2" >nul Copy %2 "%~1\"
Set /A N=10000000
:Begin
Set /A N+=1
Call Set "OutName=%~1\%~n2(%%N:~-%3%%)%~x2"
If Exist "%OutName%" GoTo :Begin
>nul Copy %2 "%OutName%"
Exit /B
@echo off
set "d_out=d:\backup"
set "f=C:\list.txt"
<"%f%" (for /f "delims=" %%a in ('more') do call :#cp "%d_out%" "%%a")
exit
:#cp
setlocal
pushd "%~1"
if not exist "%~n2%n%%~x2" (>nul copy "%~2" "%~n2%n%%~x2") else (set /a n+=1& goto #cp)
popd
endlocal
exit /b
если надо именно такой формат: asd(2).txt
@echo off
set "d_out=d:\backup"
set "f=C:\list.txt"
<"%f%" (for /f "delims=" %%a in ('more') do call :#cp "%d_out%" "%%a")
exit
:#cp
setlocal
pushd "%~1"
set /a n+=1
if not exist "%~n2(%n%)%~x2" (>nul copy "%~2" "%~n2(%n%)%~x2") else goto #cp
popd
endlocal
exit /b
cutter47
18-06-2020, 22:26
Всем большое спасибо !
Но периодически батник во всех предложенных вариантах выдает такое https://prnt.sc/t2ba1x
powershellparam(
$path = "C:\list.txt",
$backup = "d:\backup\"
)cls
gc $path|%{$q=gi -lite $_;
$i=0; $new=$backup+$q.Name
while(Test-Path $new){$i++
$new = $backup+$q.Name
$new = $new.replace($q.basename, $q.basename+"($i)")
}copy-item -lite $_ $new}
батник во всех предложенных вариантах выдает такое »
это для моего кода будет, если строк много, таков уж bat, увы.
а код megaloman запускали? Или переходите на PS как выше предложил Fors1k, там точно нет таких проблем.
megaloman
19-06-2020, 14:42
cutter47, а какое количество одинаковых по имени файлов возможно? У меня сейчас было MaxLen=3, то есть максимум 999+1 файл
(формат имени "имя(ххх).расширение"). (ххх) - такой формат нужен для удобной сортировке файлов по имени в проводнике или файл-менеджере. Можно этот параметр увеличить, при необходимости. Я протестировал батник с List.txt с >1600 строк - отработал без замечаний, хотя и долго.
А какие реально имена файлов? Если в них нет пробелов, то реально существенно ускорить его работу.
cutter47
21-06-2020, 14:38
Здравствуйте всем, спасибо большое за помощь, длина пути может содержать более 300 символов, в пути встречаются папки с китайскими иероглифами.
List.txt будет содержать чуть менее 3 миллионов строк (в принципе можно разбить на части).
Повторов копируемых файлов может быть до 100 тысяч (все разные, поэтому перезапись не приемлема)
С такими путями через проводник не работаю, работаю через тотал коммандер.
Пример строк из файла List.txt прикрепляю.
http://forum.oszone.net/attachment.php?attachmentid=161784&stc=1&d=1592739394
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.