Если вам не нужно быть быстрым в случаях с очень большим объемом:
for f_path in a/*; do f=${f_path#a/}
[[ -e "b/$f" || -e "c/$f" ]] && continue
printf '%s\n' "$f"
done
Если вы делаете и имеете GNU comm
, find
и sort
, посмотрите следующее - конечно, замените tr
в конце кодом, который фактически читает Список, разделенный NUL, если вы хотите безопасно обрабатывать все возможные имена файлов:
comm -z23 <(find a -maxdepth 1 -printf '%P\0' | sort -z) \
<(find b c -maxdepth 1 -printf '%P\0' | sort -z) \
| tr '\0' '\n'
Подробнее об использовании comm
см. BashFAQ # 36 .