Я ненавижу команду find, просто хочу, чтобы она была здесь. Безусловно, худший инструмент CLI в мире Linux, который я использовал на протяжении многих лет.
Оказывается, следующая команда ничего не вернет:
cd "$go_proj_path_root" && cd .. && find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -type d
он ничего не возвращает, потому что, по-видимому, -type l и -type d противоречат друг другу? Если я просто использую:
cd "$go_proj_path_root" && cd .. && find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l
то он найдет симлинки в dir. Есть ли способ найти и dirs, и симлинки одной и той же командой? Действительно ужасно, find! Если бы мне нужны были только симлинки, то я бы просто использовал -type l
..wtf.
решение1
Да, -type l -type d
означает «если файл является каталогомисимволическая ссылка". Возможно, вам стоит попробовать \( -type l -o -type d \)
.
Обратите внимание, что это cd
не обязательно (если только вы не используете его для проверки того, $go_proj_path_root
что у вас есть доступ к каталогу):
find "$go_proj_path_root" -mindepth 1 -maxdepth 1 \( -type l -o -type d \) -print
В качестве альтернативы, поскольку вас, по-видимому, интересуют только файлы в одном каталоге:
shopt -s nullglob dotglob
for name in "$go_proj_path_root"/*; do
if [ -d "$name" ] || [ -L "$name" ]; then
printf '%s\n' "$name"
fi
done
С zsh
оболочкой:
print -rC1 -- $go_proj_path_root/*(ND/) $go_proj_path_root/*(ND@)
... где квалификаторы glob /
и @
заставят предыдущий шаблон globing соответствовать только каталогам или символическим ссылкам соответственно, и ND
будут иметь тот же эффект, что и настройка параметров оболочки и nullglob
( расширять до нуля, если нет совпадений, а также соответствовать скрытым именам). выведет полученные имена в одном столбце ( избегает интерпретации последовательностей обратной косой черты).dotglob
bash
print -rC1
-r
решение2
Когда вы добавляете критерии поиска, он применяет их все по умолчанию: так
find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -type d
запрашивает файлы, которые одновременно являются ссылками и каталогами.
Вам необходимо использовать «или»:
find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -o -type d
Хотя здесь это не обязательно, было бы неплохо выработать привычку использовать скобки вокруг -o
:
find "$go_proj_path_root" -mindepth 1 -maxdepth 1 \( -type l -o -type d \)
(экранированы, поэтому для оболочки они ничего не значат).