Risposte:
stat
dai coreutils GNU può fare questo:
stat -c '%U' /path/of/file/or/directory
Sfortunatamente, ci sono un certo numero di versioni di stat
, e non c'è molta coerenza nella loro sintassi. Ad esempio, su FreeBSD, lo sarebbe
stat -f '%Su' /path/of/file/or/directory
Se la portabilità è una preoccupazione, probabilmente stai meglio usando il suggerimento di Gilles di combinare ls
e awk
. Deve avviare due processi anziché uno, ma ha il vantaggio di utilizzare solo la funzionalità standard POSIX:
ls -ld /path/of/file/or/directory | awk '{print $3}'
stat
(uno standard a livello di sito) in /usr/local/bin
o da qualche parte nella casa dell'utente), ed è raramente disponibile su altri unices.
stat -c '%U' DIR
stamperà UNKNOWN
, che è meno utile o più appropriato, a seconda di come lo guardi.
Analizzare l'output di ls
raramente è una buona idea , ma ottenere i primi campi è un'eccezione, in realtà funziona su tutti gli unices "tradizionali" (non funziona su piattaforme come alcune implementazioni di Windows che consentono spazi nei nomi degli utenti).
ls -ld /path/to/directory | awk 'NR==1 {print $3}'
Un'altra opzione è quella di utilizzare un stat
comando, ma il problema con stat
la shell è che ci sono più comandi con sintassi diversa, quindi stat
in uno script di shell è insostenibile (anche attraverso installazioni Linux).
Tieni presente che verificare se un determinato utente è il proprietario è una proposta diversa.
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
Sfortunatamente ci sono alcuni avvertimenti con l' approccio, come ho notato qui . Non ho ancora trovato una soluzione per "problema / file target è un link simbolico con un nome diverso", che ho citato nel mio recente commento.
find . -user "$username" -print -prune -o -prune
te potresti semplicemente farefind . -maxdepth 0 -user "$username"
awk 'NR==1 {print $3}'
invece di solo awk '{print $3}'
? Non sono sicuro del motivo per cui NR==1
è necessario qui.
ls
dove una nuova riga in un percorso provoca la divisione della linea in due (che credo sia il caso limite che stai cercando di coprire)? Su GNU ls
(nuova versione), BusyBox ls
e FreeBSD ls
viene restituita una nuova riga come $'\n'
, ?
e ?
, rispettivamente.
Si può anche fare questo con GNU find:
find $directoryname -maxdepth 0 -printf '%u\n'
Questo non è portatile al di fuori del sistema GNU, ma sarei sorpreso di trovare una distribuzione Linux dove non funziona.
find
non dispone -printf
.
-printf
:-(.
In pure bash è possibile convertire l'output di ls
in un array e indicizzarlo in esso.
# (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
Non è elegante come utilizzando stat
, find
o awk
, ma potrebbe funzionare in un pizzico.