findにすべてではなくほとんどのシンボリックリンクをたどるにはどうすればよいですか?


10

私のOSとホームディレクトリはSSDにあります。いくつかの大きなファイルをハードディスクに保存し、ホームディレクトリからハードディスクへのシンボリックリンクを作成します(たとえば、〜/ Videos / Filmsは/ mnt / hdd / Filmsへのシンボリックリンクです)。私はいくつかのWineプレフィックスも持っています。それぞれにdosdevices / z:/にシンボリックリンクがあります。

したがって、-Lを指定せずにfindを使用すると、ハードディスク上のすべてが失われます。しかし、-Lを指定してfindを使用すると、Wineの/へのシンボリックリンクが原因でループになってしまいます。

これを解決するための賢明な方法はありますか?直感的に、「dosdevicesと呼ばれるディレクトリの下にない限り、シンボリックリンクをたどる」という流れに沿って何かが必要です。「ハードディスク上の何かへのシンボリックリンクをたどる」も機能します。

回答:


11

-prune主は伝えfindディレクトリの下に再帰しません。

find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print

あなたが使用したい場合は-lname、あなたの条件に、あなたが使用することはできません-Lので、オプションを-L原因ほとんどの述語を含む、リンクのターゲットに作用します-lname。その場合の私の推奨は、検索のルートとしてホームディレクトリとハードディスクのルートの両方を使用することです。

find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'

実行find ~ -type l …して、シンボリックリンクのリストを収集し、それらを追加のルートとして使用することができます。

( IFS=$'\n'; set -f;
  find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
       -xtype f -name 'My Favorite Movie.*' )

シンボリックリンクで本当に再帰する場合は、名前ではなくターゲットで特定のシンボリックリンクを除外できます。ただし、この方法では、パターンやサブツリーではなく、有限リストのみを除外できます。

find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
     -type f -name 'My Favorite Movie.*' -print

! -writable(書き込み権限のないファイル)などの他の基準を使用できますが、ターゲットテキストが特定の式に一致する場合にのみ、GNU findがシンボリックリンクで再帰する方法はないと思います。

findシンボリックリンクを十分に除外しないことを除いて、ほぼ望みどおりのコマンドを作成し、find2perlを実行してクエリをPerlスクリプトに変換し、Perlスクリプトを少し調整します。ただし、find2perlが認識しないGNU findのスイッチは多数あります。


ありがとう!-pruneまさに私が探していたものです。私がfind ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype dフォローしたくないすべてのシンボリックリンクがリストされていることがわかりました。私は今、そのクエリを使用してプルーニングする方法を見つけようとしています。
Mark Raymond

@MarkRaymond一般的な原則はあるfind ~ <negative criteria> -prune -o <positive criteria> -printので、find ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype d -prune -o <whatever it is you want> -print
ジル「SO-停止されて悪」

@Giles-これは-Lなしで問題なく機能しますが、-Lを追加すると、-lname式は機能しなくなります(manページに記載されていないため)。したがって、基本的には、シンボリックリンクをたどる条件と、それに従わない条件が必要です。
マークレイモンド

私があなたが見つけたいものを正確に行う方法を考えることができません。いくつかの概算については私の編集を参照してください。
Gilles 'SO-邪悪なことをやめなさい'

1

すべてのリンクを検索するために、これは私のために働きました:

find -L . -name \*.txt

0

ハードディスクへのシンボリックリンクはいくつありますか?それほど多くない場合、1つの解決策は、「-L」を使用せずに、フォローするシンボリックリンクをfindコマンドラインで明示的に指定することです。何かのようなもの:

find .  ~/Videos/Films -name '*file I want*' ...

これにより、現在のディレクトリ( "。")とシンボリックリンク "〜​​/ Videos / Films"が検索されますが、他のシンボリックリンクには移動しません。


0

問題を回避する別の解決策(少なくとも私の場合)は、ハードディスク上のディレクトリにシンボリックリンクの代わりにバインドマウントを使用することです。これは、次の/etc/fstabようにエントリを追加することによって行われます。

/mnt/hdd/Films /home/mark/Videos/Films none bind 0 0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.