Elenca i file che non corrispondono alla stringa specificata nel nome file


16

Ho una directory in cui temp_log.$$vengono creati molti file (circa 200) con il nome con molti altri file importanti che devo controllare.

Come posso facilmente elencare tutti i file ed escludere i temp_log.$$file dalla visualizzazione?

Uscita prevista

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

Ho consultato la lspagina man ma non sono riuscito a trovare nulla in questo riferimento. Per favore fatemi sapere se ho perso qualche informazione vitale qui.

Grazie


in BASH, ls --hide='temp_log.$$'dovrebbe funzionare. Potresti / dovresti estenderlo anche con i caratteri jolly, a seconda della parte dell'intero termine temp_log.$$.
Erch

Risposte:


25

Con GNU ls(la versione su Linux e Cygwin non incorporati, a volte disponibile anche altrove), è possibile escludere alcuni file quando si elenca una directory.

ls -I 'temp_log.*' -lrt

(nota la forma lunga di -Iis --ignore='temp_log.*')

Con zsh, puoi lasciare che la shell esegua il filtraggio. Passare -da lsper evitare di elencare i contenuti delle directory corrispondenti.

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

Con ksh, bash o zsh, puoi usare la sintassi del filtro ksh. In zsh, esegui setopt ksh_globprima. In bash, corri per shopt -s extglobprimo.

ls -dltr !(temp_log.*)

Per favore, non virgolette singole nell'esempio per GNU ls: ls -I 'temp_log. *' -Lrt Sono necessarie per passare il pattern al comando e non lasciare che la shell lo espanda.
shargors,

Su Ubuntu bash v4.3.48, dovrebbe essere -Itemp_log.*senza spazio dopo il-I
Yan King Yin

1
@YanKingYin No, va bene avere uno spazio dopo il -I. Tuttavia, è *necessario citare in un modo o nell'altro. -I temp_log.*non funziona, ma -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*, ecc vanno bene.
Gilles 'SO- smetti di essere malvagio' il

10

È possibile utilizzare grepcon l'opzione -v.

ls -lrt | grep -v <exclude-filename-part>

1
non sono sicuro del motivo per cui questo è stato downvoted, è la risposta corretta.
Tim Kennedy,

5
Fare un grep sull'output di ls non è sempre corretto e non è raccomandato. Ha effetti collaterali. Non è in grado di ricordare problemi esatti. Nota a margine: il voto contrario non è stato da parte mia;)
mtk


3

Puoi usare findper questo:

find . \! -name 'temp_log*'

Questo stamperà solo i nomi, puoi aggiungere -lsper creare un ls -loutput di stile con data e ora o permessi, o usare -exec ls {} +per passare effettivamente a ls con qualsiasi opzione tu voglia per colonne, ordinamento, ecc.

L'ho scritto supponendo che si trattasse solo di file in una directory. Se la directory contiene altre directory, potresti evitare di elencarle in modo ricorsivo

find . \! -name 'temp_log*' -maxdepth 1

E se si utilizza ls ti consigliamo di passare l'opzione -d per fermare esso dalla quotazione all'interno delle directory:-exec ls -d {} +


Probabilmente vuole -maxdepth 1anche imitare non ricorsivo ls.
jw013,

Bello. Gli utenti che hanno un POSIX più minimale findsenza -maxdepth dovrebbero guardare qui .
Carattere jolly

2

Penso che tu voglia usare una caratteristica della shell, non di ls. Uso bash, quindi ho controllato quello che vuoi man bash. Cerca "^ EXPANSION", (premendo prima '/'). Estratto:

ESPANSIONE

    L'espansione viene eseguita sulla riga di comando dopo che è stata suddivisa in parole. Ci sono sette tipi di espansione eseguita: espansione delle parentesi graffe , tilde espansione , espansione di parametro e variabile , sostituzione di comando , espansione aritmetica , suddivisione in parole , e espansione di percorso .

   ︙
... <snip> ...
   ︙

Espansione percorso

    Dopo la suddivisione in parole, a meno che il -f opzione è stata impostata, bash scandisce ogni parola per i personaggi *, ?e [. Se viene visualizzato uno di questi caratteri, la parola viene considerata come un motivo e sostituita con un elenco in ordine alfabetico di nomi di file corrispondenti al motivo. ...

Di recente ho iniziato a escludere i file in base alla loro prima lettera, con un comando del tipo:

$ ls ./[^t]*

Ciò corrisponderebbe a tutto ciò che non inizia con la lettera t. Se aggiungi più caratteri tra parentesi, escludi anche i file che iniziano con quelle lettere.

Alla ricerca di un link, e ne ho uno buono! Vedi Corrispondenza dei motivi . Da lì, questo funzionerebbe per il tuo caso:

$ ls -lrt ./!(temp_log.*)

Ciò richiede che l' extglobopzione shell sia abilitata usando shoptbuiltin ( shopt -s extglob), come affermato da Gilles .


-1

Basta fare

ls -ltr `grep -il patterntosearch  *`

grepcerca un modello all'interno di un file, piuttosto che nel nome del file.
evilsoup,

-2

Poiché i file che NON vuoi stampare hanno "temp_log". nel nome file, quindi filtrare con grep:

ls -lrt | grep -v "temp_log."

NOTA: L'altro post con una risposta simile probabilmente è stato retrocesso perché l'utente non ha incluso le virgolette "" attorno alla stringa che grep dovrebbe cercare. Senza le virgolette, non funziona come pubblicizzato.


La tua "NOTA" non è strettamente corretta. Ci sono alcuni caratteri che potrebbero aver bisogno di essere citati, ma non credo ce ne siano in quella particolare stringa.
fuma2345

fino a quando non ci sarà un utente o un gruppo chiamato "temp_log" (il punto in regex corrisponderebbe a uno spazio o qualsiasi cosa che segue temp_log. Questo non è un buon modo (generale) per escludere i lsrisultati.
Jeff Schaller

solo con -F, @ smokes2345; un punto corrisponderà a qualsiasi personaggio in un'espressione regolare di base. Vedi: unix.stackexchange.com/q/119905/117549
Jeff Schaller
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.