web-dev-qa-db-ja.com

現在のディレクトリ内のすべてのソフトリンク(シンボリックリンク)を見つける方法は?

質問はbashのシェルスクリプトに関連しています。

スクリプトで現在のディレクトリ内のどのファイルがソフトリンクであるかを確認する方法は?

間違った用語を使用した場合、 ソフトリンク と言うときは、ln -sを使用して作成されたファイルを指します。

私が考えた唯一のことは、ls -laを式として評価し、その結果を解析することですが、明らかにこれは最善の解決策ではありません。

10
bguiz

man bashの-​​ 'CONDITIONAL EXPRESSIONS' を参照してください。この場合は-hが必要です。

for file in *
do
  if [ -h "$file" ]; then
    echo "$file"
  fi
done
14
Polsy

スクリプトは本当に必要ないかもしれません。子フォルダーに戻ることなく、現在のフォルダーのみにシンボリックリンクを表示するには:

見つける。 -maxdepth 1 -type l -print

または、さらに情報を取得するには、次のいずれかを使用します。

見つける。 -maxdepth 1 -type l -exec ls -ld {} + 
 find。 -maxdepth 1 -type l -print0 | xargs -0 ls -ld

ifファイルがシンボリックリンクであると言うには、readlinkを使用できます。これは、シンボリックリンクでない場合は何も出力しません。次の例はあまり役に立ちませんが、readlinkが通常のファイルとフォルダーを無視する方法を示しています。次のいずれかを使用します。

見つける。 -maxdepth 1 -exec readlink {} + 
 find。 -maxdepth 1 -print0 | xargs -0 readlink

上記の-exec ... +およびxargs ...-exec ... \;よりもはるかに高速であることに注意してください。お気に入り:

time find/usr/bin -maxdepth 1 -type l -exec ls -ld {} \; 
 real 0m0.372s 
 user 0m0.087s 
 sys 0m0.163s 
 
 time find/usr/bin -maxdepth 1 -type l -exec ls -ld {} + 
 real 0m0.013s 
 user 0m0.004s 
 sys 0m0.008s 
 
 time find/usr/bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld 
 real 0m0.012s 
 user 0m0.004s 
 sys 0m0.009s
14
Arjan