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.com
y ./live/example.com
los 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 -printf
supone GNU find
(la implementación más común find
en 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 failglob
opción de shell estaba configurada en el bash
shell, o si la NOMATCH
opción de shell zsh
no estaba desarmada, un patrón global sin comillas que no coincidiera con nada generaría un error desde el shell y find
no se llamaría en absoluto.
Alternativamente, simplemente genere una barra al final de los nombres de ruta del directorio (así es como ls -p
se representarían los directorios):
find . -name 'example.com*' \( -type d -exec printf '%s/\n' {} \; -o -print \)
El comando anterior find
primero prueba que el nombre sea correcto. Si lo es, y es un directorio, llama printf
para generar el nombre de ruta del directorio con una barra al final. Si no es un directorio, -print
se 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 printf
la 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 -p
para 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 -f
aquí para evitar ls
ordenar la salida y -d
evitar enumerar loscontenidode directorios.
Podrías usar ls -F
en lugar de ls -p
poner 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 -p
y -F
(y -f
y -d
) son opciones estándar de la ls
utilidad.
Respuesta3
Puedes usar file
así:
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 -printf
opción gnu (macOS, por ejemplo), puede agregar una barra al final de las rutas del directorio de ls
esta 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.