
ファイルが存在し、-L を使用してシンボリックリンクであることを確認できます。
for file in *; do
if [[ -L "$file" ]]; then echo "$file is a symlink"; else echo "$file is not a symlink"; fi
done
-dがあるディレクトリの場合:
for file in *; do
if [[ -d "$file" ]]; then echo "$file is a directory"; else echo "$file is a regular file"; fi
done
しかし、ディレクトリへのリンクのみをテストするにはどうすればよいですか?
テストフォルダのすべてのケースをシミュレートしました。
/tmp/test# ls
a b c/ d@ e@ f@
/tmp/test# file *
a: ASCII text
b: ASCII text
c: directory
d: symbolic link to `c'
e: symbolic link to `a'
f: broken symbolic link to `nofile'
答え1
2つのテストを組み合わせてください&&
。
if [[ -L "$file" && -d "$file" ]]
then
echo "$file is a symlink to a directory"
fi
または、POSIX準拠の構文の場合は、次のようにします。
if [ -L "$file" ] && [ -d "$file" ]
...
注:使用する最初の構文は[[ expr1 && expr2 ]]
有効ですが、ksh(オリジナル)、bash、zshなどの特定のシェルに固有のものです。使用される2番目の構文はPOSIX規格であり、Bourne規格にも準拠しています。つまり、すべての最新および同様のシェル[ expr1 ] && [ expr2 ]
で動作します。sh
sh
答え2
以下は、ターゲットがディレクトリ(現在のディレクトリから始まる)であるシンボリックリンクを再帰的に一覧表示するコマンドです。
find . -type l -xtype d
引用:http://www.commandlinefu.com/commands/view/6105/find-all-symlinks-that-link-to-directories
答え3
find
機能を使用したソリューション:
dosomething () {
echo "doing something with $1";
}
find -L -path './*' -prune -type d| while read file; do
if [[ -L "$file" && -d "$file" ]];
then dosomething "$file";
fi;
done