GNU/Linux >> Znalost Linux >  >> Linux

Bash:ls * bez seskupování složek

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 -- v ls 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 to bash ism, pozor — nemusí být přítomen ve všech verzích bash.
  • Pokud fonts nebo images má podadresáře ** vypíše je všechny, rekurzivně, až dolů. Jeden (poněkud nemotorný a nespolehlivý) způsob, jak omezit hloubku, je

    ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
    

    který odstraní řádky obsahující tři nebo více / znaky.


Linux
  1. Spusťte všechny skripty prostředí ve složce

  2. Obnovení ~/.bashrc bez použití příkazů bash

  3. časový limit bez procesu zabíjení v bash

  1. Extrahujte základní název souboru bez cesty a přípony v bash

  2. dokončení bash souboru bez zadání ./

  3. Spusťte příkaz v bash bez uložení do historie

  1. Historie Bash bez čísel řádků

  2. Jak extrahovat soubory bez struktury složek pomocí tar

  3. git klon bez složky projektu