Есть ли способ сделать журнал и исключить этот журнал из дальнейших запусков партии - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть риппер, который загружает файлы gif, webms, jpg, mp4 и png с таких веб-сайтов, как reddit и т. Д.

У меня около 25 000 файлов и 1500 подпапок.

В настоящее время мой«Необработанная» папка похожа на смешанную:

└───UNSORTED
    └───RAW
        ├───reddit_sub_funnycatswithdog
        │   ├───funcatdog.jpg
        │   ├───fundogcat.png
        │   ├───funnycatswithdog_983j331_cutecattries-to_.gif
        │   ├───and 500 more
        ├───reddit_sub_funnydogs
        │   ├───randomcutedog.jpg
        │   ├───randomdogs.png
        │   ├───dograndomfun.webm
        │   ├───and 500 more

Вы получаете точку.

Теперь у меня есть пакет, который фильтрует / сортирует вот так


└───Sorted
       ├───GIF FOLDER
       │    ├───reddit_sub_funnycatswithdog
       │    │   ├───funnycatswithdog_983j331_cutecattries-to_.gif
       │    │   └───and 100 more
       │    ├───reddit_sub_funnydogs
       │    │   ├───funnydogs_fdsljdsd9s_kiotdawg_123.gif
       │    │   └───and 100 more
       │    ├───reddit_sub_imoutofrandomnames
       │    │   ├───imoutofrandomnames_92382j38du8yu_socute.gif
       │    │   ├───and 100 more
       │    └───reddit_sub_randommemes
       │        ├───randommemes_023093x23_uploadedtitle.gif
       │        └───and 100 more
       ├───JPG
       │    ├───reddit_sub_funnycatswithdog
       │    │   ├───reddit_sub_funnycatswithdog_983j331_cuteries-to_eatdog.JPG
       │    │   └───and 100 more
       │    ├───reddit_sub_funnydogs
       │    │   ├───reddit_sub_funnydogs_fdsljdsd9s_kiotdawg_123.JPG
       │    │   └───and 100 more
       │    ├───reddit_sub_imoutofrandomnames
       │    │   ├───imoutofrandomnames_92382j38du8yu_socute.JPG
       │    │   └───and 100 more
       │    ├───reddit_sub_randommemes
       │    │   ├───randommemes_023093x23_uploadedtitle.JPG
       │    │   └───and 100 more

ВОПРОС1: СОЗДАТЬ ЖУРНАЛ И ИСКЛЮЧИТЬ ЕГО

Дело в том, что я хочу только ПОПРОБОВАТЬ копировать, если файл никогда не обрабатывался командным файлом.Исключение из журнала - это только то, что я вижу в отношении решения прямо сейчас, но все приветствуется.

ВОПРОС 2: ПРОВЕРЬТЕ ТИП И ПЕРЕМЕЩАЕТЕ СООТВЕТСТВУЮЩИМ

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

Есть ли способ сделать это только один раз?Проверьте тип, если gif moveto gif, если jpg moveto jpg и т. Д.

Это то, что я имею до сих пор.(без регистрации или чего-либо еще, потому что я не уверен в формате или в том, что мне нужно для правильной регистрации)

Echo off
SETLOCAL EnableDelayedExpansion

set RAW=D:\RIP\RAW
set GIF=D:\RIP\OneDrive\Sek\GIF
set PNG=D:\RIP\OneDrive\Sek\png
set MP4=D:\RIP\OneDrive\Sek\MP4
set JPG=D:\RIP\OneDrive\Sek\JPG
set WEBM=D:\RIP\webm
cd d:
Cd %RAW%
REM FOR ALL FOLDERS, DO GET IN
for /D %%u in (*) do (
   cd "%%u"
REM ONCE IN, FOR ALL THE FILES IN THE FOLDER, CHECK IF GIF, THEN DO
     for /r %%p in (*.gif) do (
echo n|xcopy  /C /i  "%%p" "%GIF%\%%u\%%~nxp*"
)
REM ONCE IN, FOR ALL THE FILES IN THE FOLDER, CHECK IF JPG, THEN DO
     for /r %%p in (*.JPG) do (
echo n|xcopy  /C /i  "%%p" "%JPG%\%%u\%%~nxp*"
)
REM ONCE IN, FOR ALL THE FILES IN THE FOLDER, CHECK IF MP4, THEN DO
     for /r %%p in (*.MP4) do (
echo n|xcopy  /C /i  "%%p" "%MP4%\%%u\%%~nxp*"

)
REM ONCE IN, FOR ALL THE FILES IN THE FOLDER, CHECK IF WEBM, THEN DO
     for /r %%p in (*.WEBM) do (
echo n|xcopy  /C /i  "%%p" "%WEBM%\%%u\%%~nxp*"

)
REM ONCE IN, FOR ALL THE FILES IN THE FOLDER, CHECK IF PNG, THEN DO
     for /r %%p in (*.PNG) do (
echo n|xcopy  /C /i  "%%p" "%PNG%\%%u\%%~nxp*"

)

    rem Go back one level up to %RAW% to process next %%u
     cd ..
)

Я пробовал это:

 for /r %%p in (*) do (
if  %%~xp == .GIF (
echo n|xcopy /C /i  "%%p" "%GIF%\%%u\%%~nxp*" 
)
 for /r %%p in (*) do (
if  %%~xp == .JPG (
echo n|xcopy /C /i  "%%p" "%GIF%\%%u\%%~nxp*" 
)

, но он копирует только то же самоефайлы во всех каталогах, как это:

└───Sorted
       ├───GIF FOLDER
       │    ├───reddit_sub_funnycatswithdog
       │    │   ├───funnycatswithdog_983j331_cutecattries-to_.gif
       │    │   ├───and 100 more
       │    ├───reddit_sub_funnydogs
       │    │   ├───funnycatswithdog_983j331_cutecattries-to_.gif
       │    │   ├───and 100 more
       │    ├───reddit_sub_imoutofrandomnames
       │    │   ├───funnycatswithdog_983j331_cutecattries-to_.gif
       ├───JPG FOLDER
       │    ├───reddit_sub_funnycatswithdog
       │    │   ├───funnycatswithdog_983j331_cutecattries-to_.JPG
       │    │   ├───and 100 more
       │    ├───reddit_sub_funnydogs
       │    │   ├───funnycatswithdog_983j331_cutecattries-to_.JPG
       │    │   ├───and 100 more
       │    ├───reddit_sub_imoutofrandomnames
       │    │   ├───funnycatswithdog_983j331_cutecattries-to_.JPG

Я ожидаю:

  1. СПОСОБ ТОЛЬКО ПОПРОБОВАТЬ / КОПИРОВАТЬ РАЗ В УНИКАЛЬНОМ ФАЙЛЕ, Неважно, сколько раз я запускаю пакет
  2. БЫСТРЫЙ СПОСОБ СОРТИРОВАТЬ ИХ, ПОТОМУ ЧТО ЭТО ДЕЙСТВИТЕЛЬНО МЕДЛЕННО.

1 Ответ

0 голосов
/ 06 февраля 2019

Это звучит немного как XY Проблема для меня.Если бы я был вами, я бы отступил и переосмыслил весь подход.

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

  • Вы используете каналы в каждом цикле только для подтверждения запроса Overwrite ... (Yes/No/All)?;каналы создают новые cmd экземпляры для любой из сторон, что занимает некоторое время.Вы можете избежать их, проверив, существует ли целевой файл, используя if exist "<target>" copy "<source>" "<target>";или, что еще лучше, вы можете позволить xcopy проверять, был ли изменен исходный файл с момента последнего копирования, с помощью xcopy /D /Y "<source>" "<target>".
  • . Вы выполняете итерацию по дереву исходного каталога несколько раз, по одному для каждого файла.расширение.Однако вы можете установить один цикл и использовать найденное расширение файла, чтобы решить, куда копировать файл.

Итак, вот возможное решение (без функции ведения журнала), которое должно быть заметно быстрее, чем ваше.подход - см. все замечания (rem), которые объясняют, как это работает:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_SOURCE=UNSORTED\RAW" & rem // (this path must not contain `=`, `!` or `^`)
set "_TARGET=SORTED"       & rem // (this path may contain all valid characters)
rem /* Define a pseudo-array with file extensions as indexes, including the preceding `.`,
rem    and directory names as values; this allows to define the same directory for several
rem    file extensions: */
set "$DIRS[.gif]=GIF"
set "$DIRS[.jpeg]=JPG"
set "$DIRS[.jpg]=JPG"
set "$DIRS[.mp4]=MP4"
set "$DIRS[.png]=PNG"
set "$DIRS[.webm]=WEBM"

rem // Use `for` loop that iterates once to resolve target path:
for /D %%D in ("%_TARGET%") do set "ROOT=%%~fD"
rem // Change into source directory:
pushd "%_SOURCE%" && (
    rem // Use `for` loop that iterates once to resolve the source path:
    for /D %%D in (".") do (
        rem // Build list of file patterns that matches all the specified file extensions:
        set "EXTS="
        for /F "tokens=2 delims=[]" %%X in ('set $DIRS[') do call set "EXTS=%%EXTS%% *%%X"
        rem // Find matching files in the source directory tree and iterate through them:
        for /F "delims=" %%F in ('dir /B /S /A:-D %%EXTS%%') do (
            rem // Store the path of the currently iterated file:
            set "FILE=%%F"
            setlocal EnableDelayedExpansion
            rem /* Build the destination file path by concatenating the resolved target
            rem    directory, the directory namd associated with the current file
            rem    extension and the file path relative to the source directory (which
            rem    is the full file path with the resolved source path removed): */
            set "DEST=!ROOT!\!$DIRS[%%~xF]!\!FILE:*%%~fD\=!"
            rem // Create destination directory, suppress error message if already done:
            2> nul md "!DEST!\.."
            rem // Copy the current file to the target location, except when already done:
            if exist "!DEST!" (
                > nul xcopy /Y /D "!FILE!" "!DEST!"
            ) else (
                > nul copy "!FILE!" "!DEST!"
            )
            endlocal
        )
    )
    rem // Return from source directory:
    popd
)

endlocal
exit /B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...