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 ls
y 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/bin
o en algún lugar de la casa del usuario), y rara vez está disponible en otras unidades.
stat -c '%U' DIR
imprimirá UNKNOWN
, lo que es menos útil o más apropiado, dependiendo de cómo lo mire.
Analizar la salida de ls
rara 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 stat
comando, pero el problema con stat
el shell es que hay varios comandos con una sintaxis diferente, por lo que stat
en 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 | awk
enfoque 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 -prune
que 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==1
es necesario aquí.
ls
dó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 ls
y FreeBSD ls
se 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.
find
que no tiene -printf
.
-printf
:-(.
En pure bash puedes convertir la salida de ls
a 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
, find
o awk
, pero podría trabajar en un apuro.