it-swarm-eu.dev

Jak zobrazit soubory bez adresářů a filtrovat podle názvu (ls options)

Mám adresář s názvem uploads. Obsahuje spoustu souborů a několik podadresářů, které zase obsahují soubory.

Existuje způsob, jak mohu (v jednom kroku) udělat následující:

  1. Uveďte POUZE soubory v kořenovém adresáři uploads - nechci vidět názvy podsložek nebo jejich obsah;

    a

  2. NEZOBRAZUJTE žádné soubory, které začínají t_

Vím o vlajce -d, Ale nedostává mě to, co chci.

45
EmmyS

Zní to jako úloha pro find.

  • Použijte -maxdepth vrátí pouze aktuální adresář, nikoli rekurzivně hledat uvnitř podsložek
  • Použijte -type f pro vrácení pouze souborů a ne adresářů nebo uzlů zařízení nebo cokoli jiného
  • Použijte kombinaci, pokud -not a -name vyhnout se souborům se jmény, které nechcete

Mohlo by se to spojit takto:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
55
Caleb

GNU ls (tj. Příkaz ls na nezačleněných Linuxových systémech a Cygwin, který je také k dispozici v některých jiných pobočkách) má možnost skrýt některé soubory na základě jejich jmen. Není však možné ignorovat adresáře.

ls --hide='t_*' uploads

Dalším přístupem je, aby váš Shell udělal shodu. Bash, ksh a zsh mají negační vzor !(t_*), který odpovídá všem souborům kromě těch, které odpovídají t*; in bash musí být tato funkce zapnuta pomocí shopt -s extglob a v zsh musí být zapnuta pomocí setopt ksh_glob. Zsh má také ekvivalentní syntaxi ^t_*, Kterou je třeba zapnout pomocí setopt extended_glob. To stále neignoruje adresáře. Zsh má další funkci, která umožňuje porovnávat soubory nejen podle jména, ale také podle metadat a dalších: kvalifikátory globálů . Na konec zápasu přidejte (.), Abyste omezili na běžné soubory. Negace ^ Je součástí syntaxe shodující se s názvem, takže ^t_*(.) znamená „všechny běžné soubory neodpovídající t_*“ “A nikoli„ všechny soubory, které neodpovídají běžným souborům “ t_* “.

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

Pokud se ocitnete bez pokročilých nástrojů, můžete to udělat na libovolném unixu pomocí find. Nejedná se o typ, který byste obvykle zadali na příkazovém řádku, ale je to výkonné a přesné. Caleb již ukázal, jak to provést s GNU find . Možnost -maxdepth Není přenosná, můžete použít -Prune místo toho přenositelně zastavit opakování find.

find uploads/* -type d -Prune -o \! -type f -name 't_*' -print

Nahraďte -print Za -exec ls -lG -- {} +, Abyste provedli ls s vašimi oblíbenými možnostmi v souborech.

Všechny příkazy výše skrývají tečkové soubory (tj. Soubory, jejichž název začíná znakem .). Pokud je chcete zobrazit, předejte -A Do ls, nebo přidejte kvalifikátor D glob v zsh (ls uploads/^t_*(.D)). S find můžete použít odlišný přístup k tomu, aby byl opakován pouze na jedné úrovni (find se speciálně nezabývá tečkami). To plně funguje, pouze pokud spustíte find v aktuálním adresáři.

cd uploads && find . -name . -o -type d -Prune -o \! -type f -name 't_*' -print
ls -l /folder | grep ^- | awk '{print $9}'
10
Krayher
ls -l | grep -v ^d | grep name$

Pokud je problém s přenositelností -maxdepth problém, můžete použít:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

Nejsem odborník, ale myslím, že by to mělo fungovat. Předpokládám, že to vypadá trochu krypticky, ale pokud mluvíte rozpačitě, tak to opravdu není. Namísto 9 $ lze použít $ NF. Můžete také:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

který dělá totéž (ale možná méně efektivně než dřívější ???).

Po přemýšlení o ostatních příspěvcích to vypadá

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

je ještě kratší a jasnější způsob.

Pokud se mýlím, někoho prosím opravte. :-)

0
kkaszub

Našel jsem tyto krátké způsoby:

ls -p uploads | grep -Ev '/'

nebo

ls -pIt_* uploads | grep -v /
0
Radu Rădeanu

Dovolte mi, abych to zkusil pomocí ls a potrubí:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

říci, že poslední sloupec je 9. sloupec.

0
Y0NG