it-swarm.it

Trova il proprietario di una directory o di un file, ma restituiscilo solo e nient'altro

Sto cercando un comando che restituirà il proprietario di una directory e solo quello - come una regex che analizza il ls -lat comando o qualcosa di simile? Voglio usare il risultato in un altro script.

67
Jason

stat da GNU coreutils può fare questo:

stat -c '%U' /path/of/file/or/directory

Sfortunatamente, ci sono diverse 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à è un problema, 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}'
107
cjm

L'analisi dell'output di ls è raramente una buona idea , ma ottenere i primi campi è un'eccezione, in realtà funziona su tutti i sistemi "tradizionali" (non funziona su piattaforme come alcune implementazioni di Windows che consentono spazi nei nomi utente).

ls -ld /path/to/directory | awk 'NR==1 {print $3}'

Un'altra opzione è quella di usare un comando stat, ma il problema con stat dalla Shell è che ci sono più comandi con sintassi diversa, quindi stat in uno script Shell non è portabile (anche su 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

Si può anche fare questo con GNU trova:

find $directoryname -maxdepth 0 -printf '%u\n'

Questo non è portatile al di fuori del GNU, ma sarei sorpreso di trovare una distribuzione Linux dove non funziona.

10
mattdm

In pure bash puoi 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 usare stat, find o awk, ma potrebbe funzionare in un pizzico.

2
codehearts