Скопировать файлы из папок
Здравствуйте, у меня очень нубский вопрос.
Мне надо из очень смешанной структуры папок перенести файлы вместе с папками в которых они расположены.
Из папки _Источник_ надо перенести все *.тхт в папку _Результат_ . Другие файлы не трогать.
Но уже без вложенности. Это что есть:
Код:
├───Источник
│ │ кит.txt
│ │
│ ├───нудно
│ │ │ ненужен.zip
│ │ │ письмо.txt
│ │ │
│ │ └───долго
│ │ │ пурга.zip
│ │ │
│ │ └───ещё
│ │ винт.txt
│ │ шуруп.txt
│ │
│ └───шмапка
│ лев.txt
│ тигр.txt
А это что нужно получить:
Код:
└───Результат
├───ещё
│ винт.txt
│ шуруп.txt
│
├───Источник
│ кит.txt
│
├───нудно
│ письмо.txt
│
└───шмапка
лев.txt
тигр.txt
Спасибо!
|
Patroklos, давайте представим, что у нас есть каталог «Затупил» в каталогах «нудно», «долго» и «шмапка» с частично совпадающими именами файлов, но различающимся содержимым (полностью или частично). Например, в каждом из трёх каталогов «Затупил» есть файл «Выплыл косяк.txt», и везде — разного размера. Наши действия?
|
Согласен - затупил.
Если это проще то перезаписываем. А лучше переименовываем.
|
Patroklos,
Если перезаписываем
Код:
@Echo off
Set "BoxIn=Z:\Источник"
Set "BoxOut=Z:\Результат"
Set "Mask=*.txt"
FOR /R "%BoxIn%" %%f IN ("%Mask%") DO Set "NDir=%%~dpf" &Call :FMove "%%f" "%%NDir:~0,-1%%" "%BoxOut%"
GoTo :Eof
:FMove
Set "Out=%~3\%~nx2"
If Not Exist "%Out%" Md "%Out%"
Move /Y %1 "%Out%\" >nul
GoTo :Eof
Если переименовываем
Код:
@Echo off
Set "BoxIn=Z:\Источник"
Set "BoxOut=Z:\Результат"
Set "Mask=*.txt"
FOR /R "%BoxIn%" %%f IN ("%Mask%") DO Set "NDir=%%~dpf" &Call :FMove "%%f" "%%NDir:~0,-1%%" "%BoxOut%"
GoTo :Eof
:FMove
Set "Out=%~3\%~nx2"
If Not Exist "%Out%" Md "%Out%"
Set /A i=1000
Set "NewName=%Out%\%~nx1"
:Begin
If Not Exist "%NewName%" Move %1 "%NewName%" >nul &GoTo :Eof
Set /A i+=1
Set "NewName=%Out%\%~n1_%i:~1%%~x1"
GoTo :Begin
GoTo :Eof
|
Вообще-то это была аллюзия на нудно и шмапка ;).
|
Цитата:
Цитата megaloman
Если перезаписываем
Если переименовываем »
|
Супер,супер,супер! Как всегда безукоризненно! Спасибо!
Цитата:
Цитата Iska
Вообще-то это была аллюзия на нудно и шмапка »
|
А теперь понятно! Написал я и понял что затупил.
|
Ещё раз спасибо. У меня остался один непринципиальный вопрос.
Скрипт отработал на отлично но у меня этих папок семь
и я должен буду время от времени повторять этот процесс.
В скрипте есть возможность перечислить папки через запятую
или мне сделать семь батников?
|
Patroklos,
Код:
@Echo Off
Call :In "Z:\Источник" "*.txt" "Z:\Результат"
Call :In "Z:\Источник 1" "*.txt" "Z:\Результат 12"
Call :In "Z:\Источник 2" "*.txt" "Z:\Результат 12"
GoTo :Eof
:In
FOR /R "%~1" %%f IN ("%~2") DO Set "NDir=%%~dpf" &Call :FMove "%%f" "%%NDir:~0,-1%%" "%~3"
GoTo :Eof
:FMove
................................ далее кусок из предыдущего кода
ПишИте хоть 100 строк с Call, при этом Маски и выходные папки могут совпадать или не совпадать при разных вызовах
|
Если результирующий каталог и маски совпадают, то можно сократить до (не проверялось):
Код:
…
for %%i in (
"Z:\Источник 1"
"Z:\Источник 2"
"Z:\Источник 3\Какой-то каталог"
"Z:\Источник 3\Ещё какой-то каталог"
) do call :In "%%~i" "*.txt" "Z:\Единый результирующий каталог"
…
|
Цитата:
Цитата Iska
Если результирующий каталог и маски совпадают, то можно сократить до (не проверялось) »
|
Спасибо!
|
Ну и раз уж, любой язык, пусть будет и powershell :)
Код:
$fld_src = 'Источник', 'Источник1', 'Источник2'
$fld_dst = 'Результат'
$flt = '*.txt'
dir $fld_src -rec -filt $flt -file|%{$i=0}{
if (!(test-path (
$dst = (gi $fld_dst).fullname+'\'+$_.directory.name
))){md $dst|out-null}
$fdst = $dst+ '\' + $_.basename
while (test-path ($fdst + $_.extension)){
$i = [int] $(if($fdst -match '.*_copy\d+'){
$fdst -replace '.*_copy(\d)','$1'
} else {0}) + 1
$fdst = $dst + '\' + $($_.basename -replace '_copy\d+') + '_copy' + $i
}
move $_.fullname ($fdst + $_.extension)
}
Файлы не перезаписываются, а складываются рядом с добавлением к имени _copy1, _copy2, _copy3 и т.д.
|
Время: 19:05.
© OSzone.net 2001-