Linuxで検索コマンドを使用してパスごとに特定のフォルダを除外する方法は?

Linuxで検索コマンドを使用してパスごとに特定のフォルダを除外する方法は?

私のディレクトリには次のコンテンツがあります。

1/
2/
3/
4/
5/
active -> 1
previous -> 2

これは、フォルダとそのフォルダを指す2つのシンボリックリンクです。シンボリックリンクを削除するのではなく、シンボリックリンクに指定されていないフォルダをすべて削除したいと思います。私は次を試しました

find . -maxdepth 1 -mindepth 1 -type d -not -path "$(readlink -f active)" -not -path "$(readlink -f previous)"

除外したい2つのディレクトリがまだ返されます。どうなりますか?

答え1

いくつかの質問があります:

  1. readlink -f絶対パスを返し、接頭-path辞付きの相対パスが必要です./
  2. 一部のバージョンは、readlink拒否されたシンボリックリンクへの末尾のスラッシュを含むパスを返しますfind(Ubuntuではテストされていますが、Gentooでは再現できません)。

これはUbuntuで私にとって効果的でしたが、おそらく最もエレガントな解決策ではありません。

find . -maxdepth 1 -mindepth 1 -type d -not -path "./$(readlink active | sed "s/\/$//")" -not -path "./$(readlink previous | sed "s/\/$//")"

realpath以下は、Gentooによってテストされた少し簡単な選択肢です。

find . -maxdepth 1 -mindepth 1 -type d -not -path "./$(realpath --relative-to=. active)" -not -path "./$(realpath --relative-to=. previous)"

答え2

-notすでにいくつかのGNUism(、、、-mindepth)を使用しているので、-maxdepth次のことができます。

find -L . -mindepth 1 -maxdepth 1 -type d ! -xtype l \
  ! -samefile active ! -samefile previous

これにより、正しい形式のシンボリックリンクターゲット(、not、nornorを./1使用している場合)に依存する必要はなく、ワイルドカードをエスケープする必要はありません(シンボリックリンクがtoの場合は1つ必要です)。find .1././1/path/to/1*-path './[*]'

または以下を使用してzsh

print -rl ./*(D/e:'[[ ! $REPLY -ef active && ! $REPLY -ef previous ]]':)

答え3

find他のディレクトリをフィルタリングするのではなく、興味のあるディレクトリで実行してみてはいかがでしょうか。

$ find ./active/ ./previous/

または

$ find "./$(readlink active)" "./$(readlink previous)" -maxdepth 0
./1
./2

findまたは、シンボリックリンクを正確に一致させたい場合いいえ方向:

$ find . -mindepth 1 -maxdepth 1  -type d  -not -path "./$(readlink active)" -not -path "./$(readlink previous)"
./3
./4
./5

関連情報