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 lse 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/bino da qualche parte nella casa dell'utente), ed è raramente disponibile su altri unices.
stat -c '%U' DIRstamperà UNKNOWN, che è meno utile o più appropriato, a seconda di come lo guardi.
Analizzare l'output di lsraramente è 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 statcomando, ma il problema con statla shell è che ci sono più comandi con sintassi diversa, quindi statin 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 | awkSfortunatamente 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 -prunete 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.
lsdove 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 lse FreeBSD lsviene 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.
findnon dispone -printf.
-printf:-(.
In pure bash è possibile convertire l'output di lsin 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, findo awk, ma potrebbe funzionare in un pizzico.