Nezdá se, že by to bylo možné bez změny výstupu, ale zde je snadný alternativní způsob:
find source/ -type f
Nebo (specifické pro GNU find), chcete-li získat pouze soubory v hloubce ve vaší otázce:
find source/ -type f -mindepth 2 -maxdepth 2
(nebo chcete-li adresáře jako ls
vám, odeberte -type f
)
Můžete se jednoduše držet ls, pokud přidáte nějaké psychedlik (ls -d
):
# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*
A/file B/file C/file
Možná vás bude zajímat „chudák's find
“:
shopt -s globstar
shopt -s
s nastaví pojmenované možnosti shellu. globstar
volba je definována následovně v bash(1):
Pokud je nastaven, vzor
**
použitý v kontextu rozšíření názvu souboru/cesty bude odpovídat souboru [sic] a nula nebo více adresářů a podadresářů. Pokud za vzorem následuje/
, shodují se pouze adresáře a podadresáře.
Takže poté, co uděláte shopt -s globstar
, některý z následujících příkazů:
ls -d1 -- source/** # The character after the ‘d’ is the digit one. ls -d -- source/** | cat # i.e., it will write that into a pipe to any command. printf "%s\n" source/**
vytvoří výstup:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
Bohužel to zahrnuje i názvy adresářů. Možná vám to trochu pomůže abych to věděl
printf "%s\n" source/**/
vytvoří výstup:
source/
source/fonts
source/images
tj. pouze názvy adresářů. Můžete přesměrovat výstup jednoho z první sady příkazů do jednoho souboru, přesměrovat výstup výše uvedených příkazů do druhého souboru a poté použít comm
, diff
, nebo něco podobného, odečíst druhý soubor od prvního a ponechat pouze obyčejné soubory (neadresáře). Ale nedělejte to.
Jiný přístup (to není moc lepší) je
ls -d --file-type -- source/** | grep -v '/$'
--file-type
volba říká ls
zobrazíte /
na konci každého názvu adresáře (a dalších znaků na koncích jiných (speciálních) typů souborů), takto:
source// # Added an extra one source/fonts/ # Added one source/fonts/fontello source/images/ # Added one source/images/bg1.png source/images/eng.png source/images/fra.png
a poté grep -v '/$'
odstraní řádky, které končí /
tj. názvy adresářů. Bohužel --file-type
volba není specifikována POSIXem. Pokud je vaše verze ls
nepodporuje, použijte -F
. To je jako --file-type
kromě toho také zobrazuje *
na koncích názvů spustitelných souborů, což některým lidem vadí. Můžete je odstranit pomocí sed
:
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
Pokud chcete se všemi soubory (a pouze se soubory) něco udělat, můžete
for f in source/** do if [ -f "$f" ] then Insert commands to be applied to plain files here. fi done
Poznámky:
- Když
ls
vystupuje na terminál a není v-l
(l ong), zapíše více jmen na řádek (pokud nejsou názvy příliš dlouhé). Zadáním-1
jej můžete vynutit, aby zapsal jeden název na řádek (jeden), nebo přesměrováním výstupu do souboru nebo kanálu. - Pravděpodobně opravdu nepotřebujete
--
vls
příkazy, protože uvádíte adresář, jehož obsah jste vytvořili. Měli byste jej použít při výpisu*
v neznámém adresáři jako ochrana před názvy souborů začínajícími-
. - Nepokoušejte se analyzovat výstup z
ls
. globstar
Zdá se, že volba shell není definována POSIXem. (Ve skutečnosti si nejsem jistý, zda POSIX rozpozná nějaké Shell options.) I když se zdá, že je tobash
ism, pozor — nemusí být přítomen ve všech verzích bash.-
Pokud
fonts
neboimages
má podadresáře**
vypíše je všechny, rekurzivně, až dolů. Jeden (poněkud nemotorný a nespolehlivý) způsob, jak omezit hloubku, jels -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
který odstraní řádky obsahující tři nebo více
/
znaky.