¿Cómo marcar directorios en la salida del comando "buscar"?

¿Cómo marcar directorios en la salida del comando "buscar"?

Por ejemplo, busco archivos y directorios en algún directorio:

ubuntu@example:/etc/letsencrypt$ sudo find . -name example.com*
./archive/example.com
./renewal/example.com.conf
./live/example.com
ubuntu@example:/etc/letsencrypt$ 

¿Cómo puedo marcar eso ./archive/example.comy ./live/example.comlos directorios que aparecen en el resultado anterior?

Respuesta1

Imprima el tipo de archivo junto con el nombre con -printf "%y %p\n":

$ sudo find . -name 'example.com*' -printf "%y %p\n"
d ./archive/example.com
f ./renewal/example.com.conf
d ./live/example.com

El uso de -printfsupone GNU find(la implementación más común finden sistemas Linux).

Respuesta2

Encuentra dos veces:

echo 'directories'
find . -name 'example.com*'   -type d

echo 'non-directories'
find . -name 'example.com*' ! -type d

Obsérvese también la cita del patrón utilizado para la prueba del nombre. Sin comillas, el shell intentaría hacer coincidir la cadena con los nombres en el directorio actual antes de llamar find. Si la failglobopción de shell estaba configurada en el bashshell, o si la NOMATCHopción de shell zshno estaba desarmada, un patrón global sin comillas que no coincidiera con nada generaría un error desde el shell y findno se llamaría en absoluto.


Alternativamente, simplemente genere una barra al final de los nombres de ruta del directorio (así es como ls -pse representarían los directorios):

find . -name 'example.com*' \( -type d -exec printf '%s/\n' {} \; -o -print \)

El comando anterior findprimero prueba que el nombre sea correcto. Si lo es, y es un directorio, llama printfpara generar el nombre de ruta del directorio con una barra al final. Si no es un directorio, -printse usa simplemente para generar el nombre de ruta tal como está.

Con GNU find, el -exec printf '%s/\n' {} \;bit podría ser reemplazado por -printf '%p/\n'.

Con standard find, también podría utilizar -exec printf '%s/\n' {} +la utilidad externa para llamar printfla menor cantidad de veces posible, pero esto significaría que los directorios probablemente se generarían al final, o al menos en lotes.


Otra alternativa es utilizar ls -ppara diferenciar los directorios de otros tipos de archivos. Usando ls -p, un directorio aparecería con un /carácter final, tal como se indicó anteriormente.

find . -name 'example.com*' -exec ls -f -d -p {} +

Estoy usando -faquí para evitar lsordenar la salida y -devitar enumerar loscontenidode directorios.

Podrías usar ls -Fen lugar de ls -pponer tambiénotromarcas en tipos de archivos que no sean directorios. Por ejemplo, los ejecutables tendrían el sufijo *y los enlaces simbólicos tendrían el sufijo @.

Ambos -py -F(y -fy -d) son opciones estándar de la lsutilidad.

Respuesta3

Puedes usar fileasí:

sudo find . -name "example.com*" -print0 | xargs  -0 sudo file

Salida de ejemplo:

$ sudo find .  -name "example.com*"   -print0 | xargs  -0 sudo file
./example.com. big file: ASCII text
./example.com-dir:       directory
./example.com:           empty

Respuesta4

Si desea una opción más portátil que funcione con versiones *nix sin la -printfopción gnu (macOS, por ejemplo), puede agregar una barra al final de las rutas del directorio de lsesta manera:

find . -name "example.com*" -exec ls -dF {} \;

ejemplo:

$ sudo find . -name "example.com*" -exec ls -dF {} \;
./archive/example.com/
./renewal/example.com.conf
./live/example.com/

Esto también está en un formato más adecuado para una mayor canalización a más comandos Unix.

información relacionada