私のディレクトリには次のコンテンツがあります。
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
いくつかの質問があります:
readlink -f
絶対パスを返し、接頭-path
辞付きの相対パスが必要です./
。- 一部のバージョンは、
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