Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скопировать файлы из папок (http://forum.oszone.net/showthread.php?t=337216)

Patroklos 16-10-2018 19:09 2836184

Скопировать файлы из папок
 
Здравствуйте, у меня очень нубский вопрос.
Мне надо из очень смешанной структуры папок перенести файлы вместе с папками в которых они расположены.
Из папки _Источник_ надо перенести все *.тхт в папку _Результат_ . Другие файлы не трогать.
Но уже без вложенности. Это что есть:
Код:

├───Источник
│  │  кит.txt
│  │
│  ├───нудно
│  │  │  ненужен.zip
│  │  │  письмо.txt
│  │  │
│  │  └───долго
│  │      │  пурга.zip
│  │      │
│  │      └───ещё
│  │              винт.txt
│  │              шуруп.txt
│  │
│  └───шмапка
│          лев.txt
│          тигр.txt

А это что нужно получить:
Код:

└───Результат
    ├───ещё
    │      винт.txt
    │      шуруп.txt
    │
    ├───Источник
    │      кит.txt
    │
    ├───нудно
    │      письмо.txt
    │
    └───шмапка
            лев.txt
            тигр.txt

Спасибо!

Iska 16-10-2018 20:07 2836189

Patroklos, давайте представим, что у нас есть каталог «Затупил» в каталогах «нудно», «долго» и «шмапка» с частично совпадающими именами файлов, но различающимся содержимым (полностью или частично). Например, в каждом из трёх каталогов «Затупил» есть файл «Выплыл косяк.txt», и везде — разного размера. Наши действия?

Patroklos 16-10-2018 20:39 2836197

Согласен - затупил.
Если это проще то перезаписываем. А лучше переименовываем.

megaloman 16-10-2018 22:09 2836207

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


Iska 16-10-2018 22:45 2836214

Цитата:

Цитата Patroklos
Согласен - затупил. »

Вообще-то это была аллюзия на нудно и шмапка ;).

Patroklos 16-10-2018 22:53 2836216

Цитата:

Цитата megaloman
Если перезаписываем
Если переименовываем »

Супер,супер,супер! Как всегда безукоризненно! Спасибо!

Цитата:

Цитата Iska
Вообще-то это была аллюзия на нудно и шмапка »

А теперь понятно! Написал я и понял что затупил.

Patroklos 17-10-2018 09:45 2836239

Ещё раз спасибо. У меня остался один непринципиальный вопрос.
Скрипт отработал на отлично но у меня этих папок семь
и я должен буду время от времени повторять этот процесс.
В скрипте есть возможность перечислить папки через запятую
или мне сделать семь батников?

megaloman 17-10-2018 10:56 2836248

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, при этом Маски и выходные папки могут совпадать или не совпадать при разных вызовах

Patroklos 17-10-2018 11:47 2836260

Спасибо большое!

Iska 17-10-2018 12:23 2836264

Если результирующий каталог и маски совпадают, то можно сократить до (не проверялось):
Код:


for %%i in (
        "Z:\Источник 1"
        "Z:\Источник 2"
        "Z:\Источник 3\Какой-то каталог"
        "Z:\Источник 3\Ещё какой-то каталог"
) do call :In "%%~i" "*.txt" "Z:\Единый результирующий каталог"


Patroklos 17-10-2018 17:15 2836301

Цитата:

Цитата Iska
Если результирующий каталог и маски совпадают, то можно сократить до (не проверялось) »

Спасибо!

YuS_2 17-10-2018 20:10 2836331

Ну и раз уж, любой язык, пусть будет и 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.

Время: 19:05.
© OSzone.net 2001-