cómo encontrar enlaces simbólicos y directorios usando el comando buscar

cómo encontrar enlaces simbólicos y directorios usando el comando buscar

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 dsignifica "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 cdno es necesario (a menos que lo esté usando para verificar que $go_proj_path_rootsea 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 zshconcha:

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 NDtiene los mismos efectos que configurar las opciones de shell nullgloby dotgloben bash(expandirse a nada si no hay coincidencias y también coincidir con nombres ocultos). Imprimirá print -rC1los nombres resultantes en una sola columna ( -revita 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).

información relacionada