純粋なfindコマンドを使用して特定のディレクトリにリンクされているすべてのソフトリンクファイルを検索する

純粋なfindコマンドを使用して特定のディレクトリにリンクされているすべてのソフトリンクファイルを検索する

〜、〜/PathA(gitディレクトリ)、〜/PathBには2つのリンクされたディレクトリがあります。 ~/PathA は ~/PathB のサブディレクトリです。これら2つは別の物理ディスクに接続されています。 ~/PathA/config/~ 以下のファイルに多くのファイルをリンクしました。このリンクされたファイルをすべて探したいです。「xxxxx -> yyyyy」形式を表示します。

この方法は、古い/他のコンピュータの設定ファイルを使用するときによく使用されます。

スクリプトを書いたりパイプを使うと簡単にできますが、少し見苦しいです。しかし、私は単に使用したいと思う探す注文すればできます。

編集:多くのテストの終わりに見つけました。最も重要なこと-l 名前そして-印刷

▶ find ~ -type l ! -path '/home/eexpss/磁盘' ! -path '/home/eexpss/bin' -lname '/home/eexpss/bin/config/*' -printf "%p -> %l\n"
/home/eexpss/.local/share/applications -> /home/eexpss/bin/config/.local+share+applications
/home/eexpss/.local/share/nautilus/scripts -> /home/eexpss/bin/config/.local+share+nautilus+scripts
/home/eexpss/.vimrc -> /home/eexpss/bin/config/fedora.vimrc
/home/eexpss/.proxy.pac -> /home/eexpss/bin/config/.proxy.pac
/home/eexpss/.bash_aliases -> /home/eexpss/bin/config/fedora.bash_aliases
/home/eexpss/.icons -> /home/eexpss/bin/config/.icons/
find: ‘/home/eexpss/磁盘/lost+found’: Permission denied
find: ‘/home/eexpss/磁盘/eexp/.gvfs’: Permission denied
/home/eexpss/.vim -> /home/eexpss/bin/config/.vim
/home/eexpss/.gitconfig -> /home/eexpss/bin/config/.gitconfig

私はStéphane Chazelasの答えを受け入れます。ありがとうございます。

ベストアンサー1

Standardは、find見つかったファイルに関する情報を(フルパスを除く)独自に印刷することはできません。ただし、一部のfind実装ではこれを拡張します。

たとえば、GNU find(最も一般的で伝統的なGNU / Linuxディストリビューションにあります)の場合:

find ~ -type l -printf '%p -> %l\n'

再帰的に検出されたシンボリックリンクに対して要求された形式でシンボリックリンクを印刷します(物理巡回(つまり、ホームディレクトリのディレクトリへのシンボリックリンクに従わない)。一部の実装には、findから情報を抽出できるのと同様の-ls形式で出力する述語もあります。ls -li

一つ作りたいならロジックナビゲーション(ディレクトリへのシンボリックリンクに従う)し、情報を印刷します。find1回の呼び出しだけではこれを行うことはできませんが(GNUの場合でも)、globbingを使用してディレクトリを参照し、GNUのみを使用して情報を印刷できますfindzshfind

find ~/***/*(D@) -printf '%p -> %l\n'

あるいは、任意のシェルとGNUを使用してくださいfind(ただし、複数の呼び出しが必要です)。

find -L ~ -xtype l -exec sh -c '
  exec find "$@" -printf "%p -> %l\n"' sh {} +

シンボリックリンクを探す最後に一部を指す既存のファイル~/bin/config(コンポーネント~/bin/config自体がシンボリックリンクではないと仮定)はまだ次のようになりますzsh

find ~/**/*(D@e{'[[ $REPLY:A = ~/bin/config/* ]]'}) -printf '%p -> %l\n'

おすすめ記事