como encontrar links simbólicos e diretórios usando o comando find

como encontrar links simbólicos e diretórios usando o comando find

Eu odeio o comando find, só quero divulgar isso. De longe, a ferramenta CLI com pior design no mundo Linux que usei por muitos anos.

Acontece que o seguinte comando não retornará nada:

cd "$go_proj_path_root" && cd .. && find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -type d

não retorna nada porque aparentemente -type le -type d se contradizem? Se eu apenas usar:

cd "$go_proj_path_root" && cd .. && find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l 

então ele encontrará os links simbólicos no diretório. Existe alguma maneira de encontrar diretórios e links simbólicos com o mesmo comando? Verdadeiramente horrível, encontre! Se eu quisesse apenas links simbólicos, usaria apenas -type l..wtf.

Responder1

Sim, -type l -type dsignifica "se o arquivo for um diretórioeum link simbólico". O que você pode querer tentar é \( -type l -o -type d \).

Observe também que o seu cdnão é necessário (a menos que você o esteja usando para verificar se $go_proj_path_rooté um diretório ao qual você tem acesso):

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 \( -type l -o -type d \) -print

Como alternativa, já que você parece estar interessado apenas nos arquivos de um único diretório:

shopt -s nullglob dotglob
for name in "$go_proj_path_root"/*; do
    if [ -d "$name" ] || [ -L "$name" ]; then
        printf '%s\n' "$name"
    fi
done

Com a zshcasca:

print -rC1 -- $go_proj_path_root/*(ND/) $go_proj_path_root/*(ND@)

... onde os qualificadores glob /e @farão com que o padrão globbing anterior corresponda apenas a diretórios ou links simbólicos, respectivamente, e NDtenha os mesmos efeitos que definir as opções de shell nullglobe (expandir para nada se não houver correspondência e também corresponder a nomes ocultos). O irá imprimir os nomes resultantes em uma única coluna ( evita a interpretação de sequências de barras invertidas).dotglobbashprint -rC1-r

Responder2

Quando você adiciona critérios para localizar, todos eles são aplicados por padrão: então

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -type d

está solicitando arquivos que sejam simultaneamente links e diretórios.

Você precisa usar “ou”:

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -o -type d

Embora não seja necessário aqui, é uma boa ideia adquirir o hábito de usar parênteses -o:

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 \( -type l -o -type d \)

(escapou para que não signifiquem nada para o shell).

informação relacionada