Vím, že to mohu udělat, abych získal seznam jmen adresářů:
find . -type d -maxdepth 1
Výstup vypadá takto:
.
./foo
./bar
Upřednostňuji zápis bez ./
. Existuje způsob, jak najít výstup pro výstup pouze surových jmen?
Snažil jsem se poslat seznam do statu, abych jej naformátoval, ale to mi dává stejný výsledek:
find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'
Pomocí GNU find
můžete použít -printf
možnost:
find . -maxdepth 1 -type d -printf '%f\n'
Jak poznamenal Paweł v komentářích, pokud nechcete, aby byl aktuální adresář uveden, přidejte -mindepth 1
, např .:
find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'
Aktualizace:
Kratší alternativa:
find . -maxdepth 1 -type d | cut -c 3-
Dá vám jména, jedno na řádek, bez lomítek
Pomocí GNU find) můžete použít -mindepth, abyste zabránili hledání ve shodě s aktuálním adresářem:
find . -type d -maxdepth 1 -mindepth 1
Protože to neděláte rekurzivně, můžete použít bash glob:
echo */
Přidání koncové/ku globálu způsobí, že budou přiřazeny pouze adresáře.
Raději bych použil:
find ./ -type d -maxdepth 1 -exec basename {} \;
Nechte sed
odstranit tyto dva znaky:
find . -maxdepth 1 -type d | sed -e 's/^\.\///'
Obvykle používám:
find * -type d
Ale nevím, jestli je to správný způsob, jak dělat to, co chcete.
V systému AIX nefunguje parametr „maxdepth“.
Obecně to funguje pro mě:
find ./ -type d | cut -d"/" -f2 | sort -u
To, co hledáte, se nazývá basename
, ignoruje unixovou strukturu adresářů
Příklad níže:
find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;
vyloučí pro výstup i adresářovou cestu, což odstraní nutnost cd
před spuštěním příkazu
Několik dalších informací:
Prošel bych -exec
jako argument, který místo toho najde |
(pipe) další příkaz pro výstup (vyhnutí se druhému příkazu přes každý výstupní řádek, ale řekl, že v závislosti na výstupu může zlepšit výkon skriptu)
POZNÁMKA: Možnosti find
jsou nikoli poziční (-maxdepth ovlivňuje testy zadané před ním, jakož i testy zadané po něm).