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í:
Uveďte POUZE soubory v kořenovém adresáři uploads - nechci vidět názvy podsložek nebo jejich obsah;
a
NEZOBRAZUJTE žádné soubory, které začínají t_
Vím o vlajce -d
, Ale nedostává mě to, co chci.
Zní to jako úloha pro find
.
-maxdepth
vrátí pouze aktuální adresář, nikoli rekurzivně hledat uvnitř podsložek-type f
pro vrácení pouze souborů a ne adresářů nebo uzlů zařízení nebo cokoli jiného-not
a -name
vyhnout se souborům se jmény, které nechceteMohlo by se to spojit takto:
find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
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}'
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. :-)
Našel jsem tyto krátké způsoby:
ls -p uploads | grep -Ev '/'
nebo
ls -pIt_* uploads | grep -v /
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.