Sé que puedo hacer esto para obtener una lista de nombres de directorio:
find . -type d -maxdepth 1
El resultado se ve así:
.
./foo
./bar
Prefiero el listado sin ./. ¿Hay alguna manera de hacer que find solo muestre los nombres sin formato?
Intenté enviar la lista a stat para formatearla, pero eso me da el mismo resultado:
find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'

foo bar ...todo en una línea sin el./frente?Respuestas:
Con GNU
findpuedes usar la-printfopción:Como señaló Paweł en los comentarios, si no desea que se agregue el directorio actual
-mindepth 1, agregue , por ejemplo:fuente
-printfopción en la última especificación POSIX y me pregunto cómo portátil es ...printfPOSIX no menciona ninguna de las opciones y no parece ser compatible con algunas de las otrasfindversiones. GNU find se puede instalar en la mayoría de los lugares, por lo que en ese sentido es portátil.-mindepth 1si desea deshacerse del.Actualizar:
Una alternativa más corta:
Le dará los nombres, uno por línea, sin barras.
fuente
ls. Al mismo tiempo, había publicado un enlace sobre por qué esta es una mala idea en otra respuesta que se eliminó desde entonces. En ese momento solo había 2 respuestas y la razón parecía obvia. Me alegra que hayas señalado la ambigüedad, y aquí está mi explicación. Para el registro, convertí mi voto a favor en un voto a favor porque estoy de acuerdo con su respuesta actual.\nnombre en un directorio que no puede usar cut para recuperarlo (que es lo que estaba haciendo cuando lo rechacé). Hay pocos casos en loslsque no se comporta de manera peligrosa y casi siempre es más seguro usarlo de otra manera.Usando GNU find, puede usar -mindepth para evitar que find coincida con el directorio actual:
Como no estás haciendo esto de forma recursiva, puedes usar un bash glob:
Agregar un final / a un glob hará que solo coincidan los directorios.
fuente
*/pierde archivos de puntos e incluye enlaces simbólicos. Esto puede o no ser un problema.Deja
sedeliminar esos dos caracteres:fuente
Prefiero usar:
fuente
Usualmente uso:
Pero no sé si es la forma correcta de hacer lo que quieres.
fuente
echo */haría lo mismo, más o menos (pierde archivos de puntos e incluye enlaces simbólicos), pero luego Joaquín le preguntaría cómo eliminar el final/.En AIX, el parámetro 'maxdepth' no funciona.
En general, esto funciona para mí:
find ./ -type d | cut -d"/" -f2 | sort -ufuente
Lo que está buscando se llama
basename, ignora la estructura de directorios de Unix.Ejemplo a continuación:
find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;excluirá para la salida incluso la ruta del directorio, eliminando la necesidad de
cdejecutar el comando antesAlguna información adicional:
Pasaría
-execcomo argumento para encontrar en su lugar|(canalizar) otro comando para la salida (evitando que el segundo comando pase por cada línea de salida, habiendo dicho eso, dependiendo de la salida podría mejorar el rendimiento del script)NOTA: las
findopciones no son posicionales (-maxdepth afecta las pruebas especificadas antes y las especificadas después).fuente