다수의 깨진 심볼릭 링크를 "다시 연결"하는 방법은 무엇입니까?

다수의 깨진 심볼릭 링크를 "다시 연결"하는 방법은 무엇입니까?

파일을 가리키는 여러 개의 심볼릭 링크가 있는 디렉토리 트리가 있습니다. 그러나 모든 심볼릭 링크 로 /home이동했으며 모든 심볼릭 링크를 "다시 연결"하는 방법이 필요합니다. 그러한 기능이 존재합니까, 아니면 이를 수행하려면 스크립트를 작성해야 합니까?/home/mnt/home

예를 들어 다음과 같은 것이 있습니다.

[root@trees ~]# ls -l /mnt/home/someone/something
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/e

/mnt/home/someone/something/subdir:
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e

모든 심볼릭 링크를 찾아 동일한 위치에 다시 연결하는 명령을 원하지만 /mnt/home대신 아래에 있습니다./home

그런 명령이 존재합니까?

답변1

심볼릭 링크를 리디렉션하는 명령은 없으며, 심볼릭 링크를 삭제하고 다른 링크를 만드는 것뿐입니다. GNU 유틸리티가 있다고 가정하면(예: 내장되지 않은 Linux 또는 Cygwin에서) main을 사용하여 대상별로 기호 링크를 일치시키고 -lname링크 내용을 읽을 수 있습니다. 테스트되지 않음:findreadlink

find /mnt/home/someone/something -lname '/home/someone/*' \
     -exec sh -c 'ln -snf "/mnt$(readlink "$1")" "$1"' sh {} \;

이러한 기호 링크를 상대적으로 만드는 것이 가장 좋습니다. lnGNU coreutils 8.22에서 온다고 가정하고 -r해당 옵션을 ln다른 옵션에 전달하면 대상이 상대 경로로 변환됩니다. 이전 시스템의 경우 또는 유효한 링크를 대량으로 다시 작성하려는 경우 다음과 같은 편리한 유틸리티가 있습니다.symlinks(원래 Mark Lord가 관리하고 현재는 J. Brandt Buckley가 관리함), 많은 Linux 배포판에 존재합니다.

위에 설명된 대로 유효한 링크를 이동하기 전이나 복원한 후에 run은 symlinks -c /mnt/home/someone/something파일 시스템 경계를 넘지 않는 한 지정된 디렉터리 아래의 모든 절대 기호 링크를 상대 기호 링크로 변환합니다.

답변2

이것이 저자가 요청한 내용이 아니라는 것을 알고 있지만 이미 답변이 있는 것 같아서 이 질문을 우연히 발견한 저와 같은 다른 사람들을 위해 이 답변을 추가하고 있습니다.

일부 심볼릭 링크의 대상을 교체하여 해결할 수 있는 깨진 심볼릭 링크가 여러 개 있는 등 보다 유연한 솔루션이 필요한 경우 다음이 도움이 될 것입니다.

예를 들어. 사용자 이름을 변경한 후 이동이 완료된 후 연결된 여러 대상에서 이전 사용자 이름을 새 사용자 이름으로 바꿉니다. 다음과 같이 replacement-simlinks라는 스크립트를 생성합니다.

#!/bin/bash
link=$1
# grab the target of the old link
target=$(readlink -- "$1")

# replace the first occurrence of oldusername with newusername in the target string
target=${target/oldusername/newusername}

# Test the link creation
echo ln -s -- "$target" "$link"

# If the above echo shows the correct commands are being issued, then uncomment the following lines and run the command again
#rm "$link"
#ln -s "$target" "$link"

다음을 사용하여 호출합니다.

find /home/newusername/ -lname '/home/oldusername/*' -exec ~/bin/replace-simlinks {} \;

이것이 누군가에게 도움이 되기를 바랍니다

편집: 이 스크립트를 시작하고 링크를 상대적으로 만들기 위해 심볼릭 링크 스크립트를 사용하는 방법에 대한 팁을 주신 Gilles에게 감사드립니다.

답변3

/home심볼릭 링크로 생성되면 /mnt/home기존의 모든 심볼릭 링크가 다시 유효해집니다.

답변4

나는 fix_broken_symlinksbash 스크립트 도구를 작성했습니다:

symlinks다른 유용한 작업을 수행하는 인기 있는 동반 도구가 되기를 바랍니다 .

내 도구는 다음과 같습니다.

# find all broken symlinks
fix_broken_symlinks path/to/dir

# dry-run fix them
fix_broken_symlinks path/to/dir find_regex replacement_str

# actually fix them (passing `-f` to force it)
fix_broken_symlinks path/to/dir find_regex replacement_str -f

나는 매우 훌륭하고 일관된 결과를 얻기 위해 많은 노력을 기울였습니다.

예제를 실행하세요:

/home/gabriel/GS/dev/RESEARCH$ fix_broken_symlinks . '/home/gabriel/GS/dev' '/home/gabriel/GS/dev/RESEARCH' -f
4 broken symlinks found!

************************************************************************
'--force' is on! Writing new **relative** symlinks!
************************************************************************

    1/4:    BROKEN: './lldb/Link to Debuggers_General' -> '/home/gabriel/GS/dev/Debuggers_General'
            FIXED : './lldb/Link to Debuggers_General' -> '/home/gabriel/GS/dev/RESEARCH/Debuggers_General'
            FINAL : './lldb/Link to Debuggers_General' -> '../Debuggers_General'
    2/4:    BROKEN: './Link to notes - Gabriel.odt' -> '/home/gabriel/GS/dev/notes - Gabriel.odt'
            FIXED : './Link to notes - Gabriel.odt' -> '/home/gabriel/GS/dev/RESEARCH/notes - Gabriel.odt'
            FINAL : './Link to notes - Gabriel.odt' -> 'notes - Gabriel.odt'
    3/4:    BROKEN: './books/Link to 104The Pragmatic Programmer, From Journeyman To Master - Andrew Hunt, David Thomas - Addison Wesley - 1999.pdf-1.desktop' -> '/home/gabriel/GS/dev/Design_Docs/104The Pragmatic Programmer, From Journeyman To Master - Andrew Hunt, David Thomas - Addison Wesley - 1999.pdf-1.desktop'
            FIXED : './books/Link to 104The Pragmatic Programmer, From Journeyman To Master - Andrew Hunt, David Thomas - Addison Wesley - 1999.pdf-1.desktop' -> '/home/gabriel/GS/dev/RESEARCH/Design_Docs/104The Pragmatic Programmer, From Journeyman To Master - Andrew Hunt, David Thomas - Addison Wesley - 1999.pdf-1.desktop'
            FINAL : './books/Link to 104The Pragmatic Programmer, From Journeyman To Master - Andrew Hunt, David Thomas - Addison Wesley - 1999.pdf-1.desktop' -> '../Design_Docs/104The Pragmatic Programmer, From Journeyman To Master - Andrew Hunt, David Thomas - Addison Wesley - 1999.pdf-1.desktop'
    4/4:    BROKEN: './books/TDD--James Grenning Test-Driven Dev for Embedded C/pragprog.com/Link to TDD_code' -> '/home/gabriel/GS/dev/books/TDD_code'
            FIXED : './books/TDD--James Grenning Test-Driven Dev for Embedded C/pragprog.com/Link to TDD_code' -> '/home/gabriel/GS/dev/RESEARCH/books/TDD_code'
            FINAL : './books/TDD--James Grenning Test-Driven Dev for Embedded C/pragprog.com/Link to TDD_code' -> '../../TDD_code'

************************************************************************
'--force' is on! New **relative** symlinks written!
************************************************************************

Run 'fix_broken_symlinks` "."' one more time to check if any symlinks are
still broken.

real    0m0.157s
user    0m0.101s
sys 0m0.086s

세부 사항

방금 거의 100개의 깨진 심볼릭 링크를 수정하는 도구를 작성했습니다. 그것은 알려져있다fix_broken_symlinks.sh, 이건 나의 일부야eRCAGuy_dot파일환매.

그것을 얻는 방법:

# download it and make it executable
wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/useful_scripts/fix_broken_symlinks.sh
chmod +x fix_broken_symlinks

# help menu, with tons of info., & examples
./fix_broken_symlinks -h

일반적인 사용법 및 예:

# General usage
fix_broken_symlinks path/to/dir find_regex replacement_str

# (Dry run) fix all broken symlinks in the current dir (.) by replacing their
# target paths with John's home dir instead of Gabriel's.
fix_broken_symlinks . '/home/gabriel/some/dir' 'home/john/some/dir'

# Pass `-f` to force it to actually apply the changes
fix_broken_symlinks . '/home/gabriel/some/dir' 'home/john/some/dir' -f

도움말 메뉴에서:

'fix_broken_symlinks' version 0.1.0

USAGE
    fix_broken_symlinks [options] <dir> [<find_regex> <replacement_string>]

DESCRIPTION

    Find all broken symlinks in directory 'dir', then extract the target paths they point to, search
    those paths for 'find_regex', and replace those findings with 'replacement_string'. Finally,
    recreate the symlinks as relative symlinks with those replacements to the target paths in
    place.

    If the 'find_regex' and 'replacement_string' are not provided, it will simply find and print out
    the broken symlinks as they currently are.

    All runs are dry-runs unless you use '--force'.

OPTIONS
    -h, -?, --help
        Print help menu
    -v, --version
        Print version information.
    --run_tests
        Run unit tests.
    -d, --debug
        Turn on debug prints.
    -f, --force
        Actually do the symlink replacements. With*out* this option, all runs are dry runs.

EXAMPLE USAGES:

    fix_broken_symlinks -h
        Print help menu.
    fix_broken_symlinks --help
        Print help menu.
    fix_broken_symlinks .
        Recursively find all broken symlinks in the current directory (.).
    fix_broken_symlinks . '/home/gabriel/some/dir' 'home/john/some/dir'
        (Dry run) fix all broken symlinks in the current dir (.) by replacing their target paths
        with John's home dir instead of Gabriel's.
    fix_broken_symlinks . '/home/gabriel/some/dir' 'home/john/some/dir' -f
        (Real run) fix all broken symlinks in the current dir (.) by replacing their target paths
        with John's home dir instead of Gabriel's. **Relative** symlinks will be created in the end.

내가 사용하는 다른 도구는 다음과 같습니다.

  1. 다음 명령을 사용하여 일회성 끊어진 심볼릭 링크를 수동으로 복구합니다.

    참고: -n바꾸려는 기호 링크가 디렉토리인 경우 이는 필수입니다. 자세한 내용은 내 의견으로 시작하는 토론을 참조하세요.다수의 깨진 심볼릭 링크를 "다시 연결"하는 방법은 무엇입니까?

    # NB: **All** of these options are important, and what I want. See 'man ln' 
    # for what each does.
    ln -svnri target_path symlink_path
    
  2. 모든 심볼릭 링크를 절대 링크에서 상대 링크로 변환합니다.

    symlinks -rsvt .  # dry run
    symlinks -rsvc .  # the real replacement
    

    우분투에 설치 symlinks:

    sudo add-apt-repository universe
    sudo apt update
    sudo apt install symlinks
    

    바라보다:https://www.makeuseof.com/how-to-find-and-fix-broken-symlinks-in-linux/

내 메모 더보기

바라보다:

  1. fix_broken_symlinks -h
  2. 이 문서에 내가 주석을 추가한 내용은 다음과 같습니다.eRCaGuy_dotfiles/git 및 Linux cmd, 도움말, 팁 및 요령 - Gabriel.txt. 검색해 보세요 = Symlink Utilities: =.

관련 정보