Windows에서 깨진 심볼릭 링크를 자동으로 찾으려면 어떻게합니까?


11

이것이 나쁜 스타일인지 확실하지 않지만 다른 곳에서 답을 찾을 수 없으므로이 질문을하고 있습니다. 그런 다음 혼자서 하나의 해결책을 찾았습니다. 다른 사람들의 솔루션을보고 싶지만 며칠 후에 나 자신을 게시 할 것입니다.

필자의 경우 Windows 7에서 실행 중이지만 다른 / 이전 버전의 Windows에 대한 답변에 관심이 있습니다. 한 가지 대답은 "Unix find 버전을 설치 한 다음 Unix와 같이 해결하십시오 "라는 것을 알고 있지만보다 "네이티브"솔루션을 원했습니다.

편집 2012-07-17 : 설명 : "자동으로"나는 버튼을 누르면 모든 작업을 수행하는 GUI 도구가 아니라 스크립트의 일부로 실행할 수있는 것을 이상적으로 의미합니다. 이 무인.

답변:


4

다소 늦었지만 여기 내 질문에 대한 내 대답이 있습니다. 기본적으로 유닉스의 일반적인 접근 방식과 동일합니다. 모든 링크를 찾은 다음 깨진 링크에 대해 조치를 취하십시오. 간결하지 않습니다. 아래 스크립트는 깨진 심볼릭 링크를 삭제 한 후 삭제 된 심볼릭 링크를 삭제합니다.

@echo off

rem Grab the list of directories to scan, before we "pushd to dir containing this script",
rem so that we can have the default be "dir from which we ran this script".
setlocal
if x%CD%==x (echo Command Extensions must be enabled. && goto :eof)
set ORIGINAL_DIR=%CD%

pushd %~dp0

set DIRS_TO_CHECK=%*
if x%DIRS_TO_CHECK%==x (
    set DIRS_TO_CHECK=.
)

rem Find all the files which are both links (/al) and directories (/ad).
rem (We use "delims=" in case any paths have a space; space is a delim by default.)
rem If not, delete it (and assume something else will fix it later :-).
echo Deleting broken symlinks ...
echo.
for %%D in (%ORIGINAL_DIR%\%DIRS_TO_CHECK%) do (
    echo Checking %%D
    echo.
    pushd %%D
    if errorlevel 1 (
        echo Cannot find "%%D"
        echo.
        goto :Next_Dir
    )
    rem Clean up broken directory links.
    for /f "usebackq delims=" %%L in (`dir /adl /b`) do (
        rem Check the directory link works.
        rem Redirecting to nul just to hide "The system cannot find the file specified." message.
        pushd "%%L" >nul 2>&1
        if errorlevel 1 (
            echo Deleting broken directory symlink "%%L".
            rem First dump out some info on the link, before we delete it.
            rem I'd rather a more human-readable form, but don't know how to get that.
            fsutil reparsepoint query "%%L"
            rmdir "%%L"
            echo.
        ) else (
            popd
        )
    )
    rem Clean up broken file (non-directory) links.
    for /f "usebackq delims=" %%L in (`dir /a-dl /b`) do (
        rem Check the file link works.
        rem Redirecting to nul just to hide "The system cannot find the file specified." message.
        copy "%%L" nul >nul 2>&1
        if errorlevel 1 (
            echo Deleting broken file symlink "%%L".
            rem First dump out some info on the link, before we delete it.
            rem I'd rather a more human-readable form, but don't know how to get that.
            fsutil reparsepoint query "%%L"
            rm "%%L"
            echo.
        ) else (
            popd
        )
    )
    popd
    :Next_Dir
    rem Putting a label on the line immediately before a ')' causes a batch file parse error, hence this comment.
)
echo Deleting broken symlinks ... done.

:Finally
popd

3

Windows에서 symlink를 찾고 제거하는 데 도움이되는 도구는 다음과 같습니다.

  1. 정션 링크 매직
  2. 디스크 접합

그것들은 모두 편리한 GUI 도구이지만 확실하지 않습니다. 스크립트에서 실행할 수있는 것을 원합니다. 명확히하기 위해 질문을 편집했습니다.
HughG


0

cygwin64 (find, xargs, sh, ls) 사용 (dead ntfs 하드 링크에 대해 win7에서 테스트)

c:\>   find ./ -type l |  xargs -I % sh -c "ls % > /dev/null 2>&1 || echo %" 

참고 : 죽은 ntfs 하드 링크에서는 test -e가 예상대로 작동하지 않습니다.


1
@mosh에게 감사하지만 내가 말했듯이 "Unix utils 버전 설치"와 관련이없는 것을 원합니다. 다른 사람이 준비하지 않고 실행할 수있는 스크립트를 원하기 때문입니다.
HughG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.