Odio el comando de búsqueda, solo quiero publicarlo. Con diferencia, la herramienta CLI peor diseñada en Linux que he usado durante muchos años.
Resulta que el siguiente comando no devolverá nada:
cd "$go_proj_path_root" && cd .. && find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -type d
¿No devuelve nada porque aparentemente el tipo l y el tipo d se contradicen? Si solo uso:
cd "$go_proj_path_root" && cd .. && find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l
luego encontrará los enlaces simbólicos en el directorio. ¿Hay alguna forma de encontrar directorios y enlaces simbólicos con el mismo comando? Realmente horrible, ¡encuéntralo! Si solo quisiera enlaces simbólicos, entonces simplemente usaría -type l
..wtf.
Respuesta1
Sí, -type l -type d
significa "si el archivo es un directorioyun enlace simbólico". Lo que quizás quieras probar es \( -type l -o -type d \)
.
Tenga en cuenta también que su cd
no es necesario (a menos que lo esté usando para verificar que $go_proj_path_root
sea un directorio al que tiene acceso):
find "$go_proj_path_root" -mindepth 1 -maxdepth 1 \( -type l -o -type d \) -print
Alternativamente, dado que parece que solo le interesan los archivos en un único directorio:
shopt -s nullglob dotglob
for name in "$go_proj_path_root"/*; do
if [ -d "$name" ] || [ -L "$name" ]; then
printf '%s\n' "$name"
fi
done
Con la zsh
concha:
print -rC1 -- $go_proj_path_root/*(ND/) $go_proj_path_root/*(ND@)
... donde los calificadores globales /
y @
harán que el patrón global anterior solo coincida con directorios o enlaces simbólicos respectivamente, y ND
tiene los mismos efectos que configurar las opciones de shell nullglob
y dotglob
en bash
(expandirse a nada si no hay coincidencias y también coincidir con nombres ocultos). Imprimirá print -rC1
los nombres resultantes en una sola columna ( -r
evita interpretar secuencias de barras invertidas).
Respuesta2
Cuando agrega criterios para buscar, los aplica todos de forma predeterminada: entonces
find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -type d
está solicitando archivos que sean simultáneamente enlaces y directorios.
Necesitas usar "o":
find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -o -type d
Si bien no es necesario aquí, es una buena idea acostumbrarse a utilizar paréntesis -o
:
find "$go_proj_path_root" -mindepth 1 -maxdepth 1 \( -type l -o -type d \)
(se escaparon para que no signifiquen nada para el caparazón).