Pokud to chcete udělat pomocí standardních nástrojů, měl by fungovat následující kanál:
find . -type d | perl -lne 'print tr:/::, " $_"' | sort -n | cut -d' ' -f2
To znamená,
- najděte a vytiskněte zde všechny adresáře v první řadě podrobně
- spočítejte počet lomítek v každém adresáři a přidejte je před cestu
- řazení podle hloubky (tj. počtu lomítek)
- extrahujte pouze cestu.
Pro omezení nalezené hloubky přidejte do příkazu find argument -maxdepth.
Pokud chcete, aby adresáře byly uvedeny ve stejném pořadí, ve kterém je najdou výstup, použijte "sort -n -s" místo "sort -n"; příznak "-s" stabilizuje řazení (tj. zachovává pořadí vstupů mezi položkami, které se porovnávají stejně).
find
příkaz podporuje -printf
možnost, která rozpoznává mnoho zástupných symbolů.
Jedním takovým zástupným symbolem je %d
který vykresluje hloubku dané cesty vzhledem k find
začalo.
Proto můžete použít následující jednoduchý jednolinkový:
find -type d -printf '%d\t%P\n' | sort -r -nk1 | cut -f2-
Je to docela jednoduché a nezávisí na těžkých nástrojích jako perl
.
Jak to funguje:
- interně generuje seznam souborů, z nichž každý je vykreslen jako čára se dvěma poli
- první pole obsahuje hloubku, která se používá pro (zpětné) numerické třídění, a poté se odřízne
- výsledkem je jednoduchý výpis souborů, jeden soubor na řádek, v nejhlubším pořadí
Jak fungují pseudoterminály *nix? Jaký je hlavní/podřízený kanál?
Jak vypsat spuštěné relace obrazovky?