Come escludere / ignorare i file e le directory nascosti in una ricerca "Trova" con caratteri jolly?

97

A partire da (notare i caratteri jolly prima e dopo "testo")

find . -type f -name '*some text*'

come si può escludere / ignorare tutti i file e le directory nascosti?

Ho già googling per troppo tempo , mi sono imbattuto in -prune e! (punto esclamativo) parametri, ma nessun esempio di adattamento (e parsimonioso) che ha appena funzionato .

Piping | in grep sarebbe un'opzione e sarei anche lieto di fornirgli esempi; ma principalmente mi interessa un breve one-liner (o un paio di one-liner stand-alone, che illustrano diversi modi per raggiungere lo stesso obiettivo della riga di comando) solo utilizzando find .

ps: Trova i file in linux ed escludi directory specifiche sembra strettamente correlato, ma a) non è ancora accettato e b) è correlato-ma-diverso-e-distinto, ma c) può fornire ispirazione e aiutare a individuare la confusione!

Modifica

find . \( ! -regex '.*/\..*' \) -type f -name "whatever" , funziona. La regex cerca "qualsiasi cosa, poi una barra, poi un punto, poi qualsiasi cosa" (cioè tutti i file e le cartelle nascosti incluse le relative sottocartelle) e il "!" nega la regex.

    
posta nutty about natty 10.03.2013 - 12:58

6 risposte

3

La risposta originariamente inviata come "modifica" alla mia domanda originale sopra:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever" , funziona. La regex cerca "qualsiasi cosa, poi una barra, poi un punto, poi qualsiasi cosa" (cioè tutti i file e le cartelle nascosti incluse le relative sottocartelle) e il "!" nega la regex.

    
risposta data nutty about natty 11.08.2015 - 09:31
108

Stampa tutti i file che discendono dalla tua directory, ignorando file e directory nascosti:

find . -not -path '*/\.*'

Quindi se stai cercando un file con some text nel suo nome e vuoi saltare file e directory nascosti, esegui:

find . -not -path '*/\.*' -type f -name '*some text*'

Spiegazione:

L'opzione -path viene eseguita controlla un modello sull'intera stringa del percorso. * è un carattere jolly, / è un separatore di directory, \. è un punto (deve essere sottoposto a escape per evitare un significato speciale) e * è un altro carattere jolly. -not significa non selezionare i file che corrispondono a questo test.

Non penso che find sia abbastanza intelligente da evitare ricorsivamente la ricerca di directory nascoste nel comando precedente, quindi se hai bisogno di velocità, usa -prune invece, in questo modo:

 find . -type d -path '*/\.*' -prune -o -not -name '.*' -type f -name '*some text*' -print
    
risposta data Flimm 09.07.2013 - 18:30
6

Questo è uno dei pochi mezzi per escludere i dot-file che funziona correttamente anche su BSD, Mac e Linux:

find "$PWD" -name ".*" -prune -o -print
  • $PWD stampa il percorso completo della directory corrente in modo che il percorso non inizi con ./
  • -name ".*" -prune corrisponde a qualsiasi file o directory che iniziano con un punto e quindi non scendono
  • -o -print significa stampare il nome del file se l'espressione precedente non corrisponde a nulla. L'utilizzo di -print o -print0 fa sì che tutte le altre espressioni non vengano stampate per impostazione predefinita.
risposta data eradman 24.03.2016 - 14:51
4
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

Esclude tutte le directory nascoste e i file nascosti sotto $ DIR

    
risposta data guest 28.02.2014 - 01:49
3

Non devi usare find per quello. Basta usare globstar nella shell stessa, come:

echo **/*foo*

o

ls **/*foo*

dove **/ rappresenta qualsiasi cartella in modo ricorsivo e *foo* qualsiasi file che ha foo nel suo nome.

Per impostazione predefinita, utilizzando ls verranno stampati i nomi dei file, esclusi i file e le directory nascosti.

Se non hai abilitato il globbing, fallo da shopt -s globstar .

Nota: Una nuova opzione di globbing funziona in Bash 4, zsh e shell simili.

Esempio:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden
    
risposta data kenorb 20.04.2015 - 11:49
1

find ha interruttori logici accurati come -and e -not puoi usarli a tuo vantaggio per trovare un file corrispondente con due regole in questo modo:

$ touch non_hidden_file.txt .hidden_file.txt somethings/.another_hidden_file.txt                                                 

$ find . -type f -name '*hidden_file*' -and \( -not -name ".*" \)                            
./non_hidden_file.txt

Come puoi vedere, find usa due regole -name '*hidden_file*' e -and \( -not -name ".*" \) per trovare quei nomi di file che soddisfano entrambe le condizioni - nomefile con hidden_file in esso ma senza punto iniziale. Notare le barre davanti alla parentesi - sono usate per definire le parentesi come argomenti find piuttosto che definire una subshell (che è ciò che la parentesi significa altrimenti senza barre)

    
risposta data Sergiy Kolodyazhnyy 16.05.2017 - 00:01

Leggi altre domande sui tag