Respuestas:
stat de GNU coreutils puede hacer esto:
stat -c '%U' /path/of/file/or/directory
Desafortunadamente, hay varias versiones de stat, y no hay mucha consistencia en su sintaxis. Por ejemplo, en FreeBSD, sería
stat -f '%Su' /path/of/file/or/directory
Si la portabilidad es una preocupación, probablemente sea mejor usar la sugerencia de Gilles de combinar lsy awk. Tiene que iniciar dos procesos en lugar de uno, pero tiene la ventaja de usar solo la funcionalidad estándar POSIX:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat(un estándar de todo el sitio) en /usr/local/bino en algún lugar de la casa del usuario), y rara vez está disponible en otras unidades.
stat -c '%U' DIRimprimirá UNKNOWN, lo que es menos útil o más apropiado, dependiendo de cómo lo mire.
Analizar la salida de lsrara vez es una buena idea , pero obtener los primeros campos es una excepción, en realidad funciona en todos los dispositivos "tradicionales" (no funciona en plataformas como algunas implementaciones de Windows que permiten espacios en los nombres de usuario).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Otra opción es usar un statcomando, pero el problema con statel shell es que hay varios comandos con una sintaxis diferente, por lo que staten un script de shell no es portátil (incluso en instalaciones de Linux).
Tenga en cuenta que probar si un usuario determinado es el propietario es una propuesta diferente.
if [ -n "$(find . -user "$username" -print -prune -o -prune)" ]; then
echo "The current directory is owned by $username."
fi
if [ -n "$(find . -user "$(id -u)" -print -prune -o -prune)" ]; then
echo "The current directory is owned by the current user."
fi
ls | awkenfoque también, lamentablemente, como he señalado aquí . Todavía no he encontrado una solución para el problema "el archivo / directorio de destino es un enlace simbólico con un nombre diferente" que mencioné en mi comentario reciente.
find . -user "$username" -print -prune -o -pruneque pudieras simplemente hacerfind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'lugar de solo awk '{print $3}'? No estoy seguro de por qué NR==1es necesario aquí.
lsdónde una nueva línea en una ruta hace que la línea se divida en dos (que creo que es el caso límite que está tratando de cubrir)? En GNU ls(versión nueva), BusyBox lsy FreeBSD lsse devuelve una nueva línea como $'\n', ?y ?, respectivamente.
También se puede hacer esto con GNU find:
find $directoryname -maxdepth 0 -printf '%u\n'
Esto no es portátil fuera del sistema GNU, pero me sorprendería encontrar una distribución de Linux donde no funcione.
findque no tiene -printf.
-printf:-(.
En pure bash puedes convertir la salida de lsa una matriz e indexarla.
# (lrwxr-xr-x, 1, myuser, staff, 36, Oct, 21, 16:36, /path/to/file)
file_meta=($(ls -ld /path/to/file))
file_owner="${file_meta[2]}" # myuser
No es tan elegante como el uso stat, findo awk, pero podría trabajar en un apuro.