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ž
lsvystupuje 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-1jej 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
--vlspří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. globstarZdá 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 tobashism, pozor — nemusí být přítomen ve všech verzích bash.-
Pokud
fontsneboimagesmá 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.