Come trovare tutti i file tranne un file specificato


13

L' lspuò dare un risultato come

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

Ma in realtà spero solo di scoprire CentOS-Base.repoCentOS-Debuginfo.repoe CentOS-Vault.repoma no CentOS-Media.repo. Quindi eseguo questo comando

ls [^\(Media\)]

Ma ricevo informazioni di errore. Come devo fare?



@steeldriver Grazie per il tuo link, è molto utile per me ..
yode

Potresti considerare di cambiare la shell su zsh , che ha una funzione di rimozione dei pattern
Basile Starynkevitch,

Risposte:


10

Nella maggior parte dei casi è possibile utilizzare quanto segue (nel caso in cui la prima parola secondaria sia statica CentOS):

ls CentOS-[BDV]*

  • [BDV] - classe di caratteri per garantire la seconda parola secondaria che inizia con uno dei caratteri specificati

o lo stesso con negazione :

ls CentOS-[^M]*

Se vuoi ignorare tutti i nomi di file che contengono il Mcarattere, con l'implementazione GNU di ls(come in genere si trova su CentOS), usa l' opzione -I( --ignore):

ls -I '*M*'

-I, --ignore = PATTERN
non elenca le voci implicite che corrispondono alla shell PATTERN

Per ignorare le voci con Mediaword:

ls -I '*Media*'

Questi schemi devono essere passati alla lettera ls, quindi devono essere citati (altrimenti la shell li tratterà come globi da espandere).


Perché non possiamo usare ls *[^M]*
yode il

Il ls CentOS-[^M]*lavoro, ma il ls *[^M]*non ..
yode

@yode, dipende da cosa esattamente vuoi ignorare: Moccorrenza del personaggio O Mediaparola?
RomanPerekhrest,

Ma nel mio caso, solo quel file ha un carattere M.
yode

3
I modelli sono golosi: il primo * corrisponde a tutto tranne che all'ultima lettera, il [^ M] corrisponde all'ultima lettera poiché nessuno di essi termina con M e il trailing * corrisponde alla stringa vuota. Quindi tutti corrispondono. E anche se qualcosa finisse con M, corrisponderebbe comunque, supponendo che ci fosse qualcosa di diverso da M da qualche parte: ad esempio se avessi un file chiamato OOM, la prima stella corrisponderebbe alla prima O, la [^ M] corrisponderebbe alla seconda O e l'inizio del trailing corrisponderebbe al M.
NickD del

12

Alcune conchiglie hanno operatori di globbing negazione:

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

    ls -d -- !(*Media*)
    
  • bash:

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh:

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    

6

Un'opzione è usare findcon le -not -name bandiere. Vale a dire find . -not -name CentOS-Media.repo. Se non si desidera ricorrere alla struttura della directory, aggiungere -maxdepth 1flag.

In alternativa, si può scrivere quanto segue (che è molto più complesso, ma mi sono dimenticato della -notbandiera e ho pubblicato questa risposta in origine, quindi non eliminerò questa parte):

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

Devi forzare finda separare i nomi dei file con byte null, in modo che le nuove righe nei nomi dei file non scompongano nulla. Speriamo che grepsupporti questo tipo di separatore con bandiera -z. Si consiglia di ripristinare la separazione tipica (ovvero byte null -> nuova riga) contr '\0' '\n'


1
Puoi anche ottenere nomi di file separati da null con i printf '%s\0' *quali non viene utilizzato e non include dotfile per impostazione predefinita (ma alcune shell hanno un'opzione per questo). Inoltre, non è necessario -Eper quel regexp, ma per essere pignoli dovresti eseguire il backslash .o inserirlo [], e dipendi da GNU find e grep.
dave_thompson_085,

4

Il modo più semplice è usare find. Fare:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

Qui "f" significa cercare solo file regolari (esclude i collegamenti simbolici a file regolari; con GNU find, utilizzare -xtype finvece per includerli). Se si desidera cercare directory, passare invece "d".

( -maxdepthMentre inizialmente un'estensione GNU è ora abbastanza comune. Se findnon la supporti, puoi sostituirla -maxdepth 1con lo standard ! -name . -prune).

guarda la pagina man di ricerca per altre fantastiche funzionalità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.