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
find
puedes usar la-printf
opción:Como señaló Paweł en los comentarios, si no desea que se agregue el directorio actual
-mindepth 1
, agregue , por ejemplo:fuente
-printf
opción en la última especificación POSIX y me pregunto cómo portátil es ...printf
POSIX no menciona ninguna de las opciones y no parece ser compatible con algunas de las otrasfind
versiones. GNU find se puede instalar en la mayoría de los lugares, por lo que en ese sentido es portátil.-mindepth 1
si 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.\n
nombre en un directorio que no puede usar cut para recuperarlo (que es lo que estaba haciendo cuando lo rechacé). Hay pocos casos en losls
que 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
sed
eliminar 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 -u
fuente
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
cd
ejecutar el comando antesAlguna información adicional:
Pasaría
-exec
como 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
find
opciones no son posicionales (-maxdepth afecta las pruebas especificadas antes y las especificadas después).fuente