複数の壊れたシンボリックリンクを「再接続」する方法は?

複数の壊れたシンボリックリンクを「再接続」する方法は?

ファイルを指す複数のシンボリックリンクを持つディレクトリツリーがあります。しかし、すべてのシンボリックリンクに/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
    

    Ubuntuへのインストール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: =

関連情報