シンボリックリンクとそのポインタを除くディレクトリの内容を一覧表示するには?

シンボリックリンクとそのポインタを除くディレクトリの内容を一覧表示するには?

アプリケーションがインストールされているディレクトリがあり、最新バージョンを指すようにシンボリックリンクを更新します。

これにより、それを指すシンボリックリンクがないため、多くの古いディレクトリが使用されなくなります。

これまでにls -l検査を使用し、手動で削除してきました。これをスクリプトで書けば便利です。

シンボリックリンクを除外できますか?

find -maxdepth 1 \! -type l -exec ls -dl {} +

しかし、彼らが何を指しているのか、どのように見つけて排除するのかわかりません。

シンボリックリンク以外のディレクトリを一覧表示する方法そして彼らが指すディレクトリは何ですか?

答え1

これにより、zsh次のことができます。

linktargets=(*(N@:P))
ls -ld -- *(^@e['(($linktargets[(eI)$REPLY:P]))'])

すべてのシンボリックリンクに適用される$linktargets配列を作成し、シンボリックリンクではなく、配列内の実際のrealpath()パスls -ldが見つからないファイルを渡します。

実際のパスを取得することに関連しない別の方法は、すべての非symlinkファイルの配列、つまりシンボリックリンクターゲットを含む別の配列を構築してから2つを引くことです。

zmodload zsh/stat
non_symlinks=(*(^@))
stat -A symlink_targets +link -- *(@)
ls -ld -- ${non_symlinks:|symlink_targets}

シンボリックリンク先には文字が含まれていないと仮定しますが/(リンクはlink -> file、is not link -> ./filelink -> /path/to/file...)

答え2

GNUfindrealpath、改行文字を含むファイル名がないとします。

find . -mindepth 1 -maxdepth 1 -exec realpath -e --relative-to=. {} + | sort | uniq -u

これはrealpath、すべてのパスを確認する必要があり、シンボリックリンクで指すファイルがリストに2回表示されるようにすることによって行われます。sort | uniq -u一度表示されたコンテンツのみが保持されます。

注意深いツリーの外部(またはサブディレクトリ)を指すことができるシンボリックリンクを使用すると、これについて知りたい場合がありますが、そのパイプにエントリを追加grep -v /する| xargs rm -fr前にフィルタリングすることもできます;-)。

より良い(より標準的ですがあまり明確ではありません)代替手段find . -mindepth 1 -maxdepth 1 ...ですfind . ! -name . -prune ...

GNUツール-zとオプションを使用してファイル名の改行をサポートすることもできます。-0

また参考にしてくださいローカライズ仕上げ実装は壊れたsort多くのシステムでは(一部の特殊文字は完全に無視されます)とのローカライズを無効にすることをお勧めしますuniq

一緒に入れてください:

find . ! -name . -prune -exec realpath -ez --relative-to=. {} + |
  grep -zv / |
  LC_ALL=C sort -z |
  LC_ALL=C uniq -zu |
  xargs -r0 do_something

関連情報