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 d
significa "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 cd
nã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 zsh
casca:
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 ND
tenha os mesmos efeitos que definir as opções de shell nullglob
e (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).dotglob
bash
print -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).