Удалить все лишние файлы в каталоге - PullRequest
1 голос
/ 14 июля 2010

У меня есть directoryA , который заполняется как копия directoryB , и некоторые файлы изменяются или добавляются.Я хочу автоматизировать процесс удаления всех файлов из каталога каталога A с избыточными копиями в каталоге B .

Обакаталоги имеют несколько уровней подкаталогов, поэтому решение, вероятно, должно быть рекурсивным.

Моя первая мысль - создать пакетный скрипт, но я новичок в командной строке microsoft и, похоже,сильно отличается от сценариев bash, с которыми у меня ограниченный опыт.

Я использую Windows XP, но хотел бы решение, которое также работает в Windows 7.

Ответы [ 3 ]

2 голосов
/ 14 июля 2010

В вашей ситуации я бы выбрал выход ленивца, установил mingw и использовал

find directoryA directoryB -type f -exec md5sum '{}' ';' |
my-bash-script

чтобы найти каждый файл в каталоге A, имеющий такую ​​же подпись MD5, как файл в каталоге B, а затем удалите его.

Или, если вы предпочитаете менее ленивое решение, но не требующее mingw, установите Lua и библиотеку Lua POSIX (которую я думаю можно установить в Windows). Вы можете поискать библиотеку MD5 и выполнить всю операцию в Lua, и она будет переносимой. И, в отличие от решения mingw, его будет легко развернуть на любой Windows-системе; Вы можете сделать автономный двоичный файл.

1 голос
/ 16 июля 2010

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

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

@echo off
rem delete files from a directory that have a redundant copy in a backup directory

setlocal enabledelayedexpansion

rem check arguments
if "%~2"=="" (
    echo.Usage: %~n0 cleanup_dir backup_dir
    echo.Delete files from cleanup_dir that have a redundant copy in backup_dir
    exit /b 1
)

set CLEANUP_DIR=%~f1
if not exist "%CLEANUP_DIR%" (
    echo."%CLEANUP_DIR%" does not exist.
    exit /b 1
)

set BACKUP_DIR=%~f2
if not exist "%BACKUP_DIR%" (
    echo."%BACKUP_DIR%" does not exist.
    exit /b 1
)

rem ensure that dirs are different
if "%CLEANUP_DIR%" == "%BACKUP_DIR%" (
    echo.backup directory must not be the same as cleanup directory.
    exit /b 1
)

rem ensure that backup_dir is not a sub dir of cleanup_dir
if not "!BACKUP_DIR:%CLEANUP_DIR%=!" == "%BACKUP_DIR%" (
    echo.backup directory must not be a sub directory of cleanup directory.
    exit /b 1
)

rem iterate recursively thru files in cleanup_dir
for /R "%CLEANUP_DIR%" %%F in (*) do (
    set FILE_PATH=%%F
    set BACKUP_FILE_PATH=!FILE_PATH:%CLEANUP_DIR%=%BACKUP_DIR%!
    if exist "!BACKUP_FILE_PATH!" (
        rem binary compare file to file in backup dir
        fc /B "!FILE_PATH!" "!BACKUP_FILE_PATH!" >NUL 2>&1
        if not errorlevel 1 (
            rem if files are identical delete file from cleanup_dir
            echo.delete redundant "!FILE_PATH!".
            del "!FILE_PATH!"
        ) else (
            echo.keep modified "!FILE_PATH!".
        )
    ) else (
        echo.keep added "!FILE_PATH!".
    )
)
1 голос
/ 14 июля 2010

Я разбираюсь в Windows, но вы, вероятно, найдете мощные скриптовые возможности, которые вам нужны в Windows PowerShell (см. Также Документация Microsoft ).

PowerShell использует объектно-ориентированный подход к объектам в файловой системе и в других местах. Должно быть легко создать сценарий, чтобы сделать то, что вам нужно, но вам, конечно, сначала нужно изучить PowerShell.


РЕДАКТИРОВАТЬ: Microsoft предлагает скачать для PowerShell для Windows XP и некоторых других, но я не вижу один для Windows 7. Ах ... Википедия говорит, что он уже интегрирован в Windows 7. Это должно соответствовать вашим требованиям и он уже встроен в новейшие версии Windows.

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