移植性が高く、次のことができます。
find . -type d -exec sh -c '
for dir do
[ -f "$dir/README" ] || printf "%s\n" "$dir"
done' sh '{}' +
[ -f file ]
ファイルが存在 し、通常のファイルであることが確認されたかどうかをテストします(シンボリックリンクの解決後)。
タイプに関係なく、それが(そのディレクトリのエントリとして)のみ存在することをテストする場合は、次のものが必要です[ -e file ] || [ -L file ]
。ただし、これらのテストを実行するには、ディレクトリへの検索権限が必要です。次の[ -x "$dir" ]
ような場合に対応するために、いくつかのテストを追加することができます。
find . -type d -exec sh -c '
for dir do
if [ -x "$dir" ]; then
[ -f "$dir/README" ] || printf "%s\n" "$dir"
else
printf >&2 "Cannot tell for \"%s\"\n" "$dir"
fi
done' sh '{}' +
または、次のようにして、競合状態を回避しzsh
ます。
find . -type d -exec zsh -c '
zmodload zsh/system
for dir do
ERRNO=0
if [ ! -f "$dir/README" ]; then
if [ "$errnos[ERRNO]" = ENOENT ]; then
printf "%s\n" "$dir"
else
syserror -p "ERROR: $dir/README: "
fi
fi
done' zsh '{}' +
参照してくださいBashに通常のファイルが存在しないかどうかを確認するにはどうすればよいですか?SOで。