Elencare i file che corrispondono a un modello ma ignorare i file che corrispondono a un altro modello?


12

Diciamo che ho una directory con i file a1, a2, a3, b1, b2, b3. Voglio solo abbinare i file che iniziano con ama che non contengono 3. Ho provato ls -I "*3" *a*ma ritorna a1 a2 a3, anche se non voglio che corrisponda a3. È possibile con ls?


interessante insieme diversificato di risposte qui, ma una spiegazione del perché ls -I '* 3' a * fallisce sarebbe edificante. e / o perché l'elenco globbed della shell non viene successivamente filtrato dall'interruttore ignore su ls?
Teofrasto,

La pagina man dice dell'opzione -I:, do not list implied entries matching shell PATTERNtuttavia non spiega cosa si intende per implicito , ma suppongo che si applica solo ai file che lsottengono espansioni di glob - e lsnon espande il a*, la shell lo fa .
Murray Jensen,

Risposte:


14

Appena:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob attiva il globbing esteso.
  • a corrisponde all'inizio a
  • !()annulla la partita all'interno del ()...
    • *3*che è 3e qualsiasi cosa prima o dopo.

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2

1
Cordiali saluti, richiedeset -s extglob
Brian

@Brian Yea, ho appena notato ^^
caos,

8

Le risposte esistenti indicano bene il modo migliore per farlo con globs; Includerò questo perché nella maggior parte dei casi findè un'opzione migliore se si desidera eseguire script o ulteriori elaborazioni:

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

Puoi fornire la risposta a xargsper azioni semplici o a un while readciclo per cose più complicate.


4

Un modo semplice è

  • per elencare tutti i file corrispondenti a*
  • quindi eliminare tutte le righe contenenti a 3

Il comando UNIX è

ls -1 a* | grep -v 3

ls -1 mostra un file per riga.

grepnormalmente trova linee che corrispondono a un modello ma con -vquesto comportamento è invertito, cioè grep trova linee che non corrispondono a quel modello.


2
Ciao Peter! Sarebbe meglio spiegare, nel modo più dettagliato possibile, come funziona la tua soluzione.
Dhag,

2
L'analisi lsnon è un'idea goob: mywiki.wooledge.org/ParsingLs
caos

3

Con zsh, usando l' ~ operatore glob :

setopt extendedglob
print -rl -- a*~*3*

Con gnu lste puoi usare due --ignoreopzioni:

ls -I '[^a]*' -I '*3*'

il primo ignora tutti i nomi di file che non iniziano con ae il secondo ignora i nomi di file che contengono3

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.