it-swarm-eu.dev

Najděte vlastníka adresáře nebo souboru, ale vraťte to pouze a nic jiného

Hledám příkaz, který vrátí vlastníka adresáře a jen to - například regex, který analyzuje ls -lat příkaz nebo něco podobného? Chci použít výsledek v jiném skriptu.

67
Jason

stat z GNU coreutils to může udělat:

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

Bohužel existuje řada verzí stat a jejich syntaxe není příliš konzistentní. Například na FreeBSD by to bylo

stat -f '%Su' /path/of/file/or/directory

Pokud se jedná o přenositelnost, pravděpodobně budete lépe používat Gillesův návrh zkombinovat ls a awk. Musí spouštět dva procesy namísto jednoho, ale má tu výhodu, že používá pouze POSIX standardní funkce:

ls -ld /path/of/file/or/directory | awk '{print $3}'
107
cjm

Analýza výstupu ls je zřídka dobrý nápad , ale získání prvních několika polí je výjimkou, ale ve skutečnosti funguje na všech „tradičních“ odvětvích (na platformách nefunguje) například některé implementace systému Windows, které umožňují mezery v uživatelských jménech).

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

Další možností je použití příkazu stat, ale problém s stat ze Shell spočívá v tom, že existuje více příkazů s odlišnou syntaxí, takže stat ve skriptu Shell je nedostupné (i přes instalace systému Linux).

Mějte na paměti, že testování, zda je daný uživatel vlastníkem, je jiný návrh.

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

Dá se to také provést pomocí GNU najít:

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

Toto není přenosné mimo systém GNU), ale byl bych překvapen, kdybych našel distribuci Linuxu, kde to nefunguje.

10
mattdm

V čistě bash můžete převést výstup ls na pole a indexovat do něj.

# (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

Není to tak elegantní jako použití stat, find nebo awk, ale může fungovat jako špetka.

2
codehearts