как найти символические ссылки и каталоги с помощью команды find

как найти символические ссылки и каталоги с помощью команды find

Я ненавижу команду 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( расширять до нуля, если нет совпадений, а также соответствовать скрытым именам). выведет полученные имена в одном столбце ( избегает интерпретации последовательностей обратной косой черты).dotglobbashprint -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 \)

(экранированы, поэтому для оболочки они ничего не значат).

Связанный контент