Seguendo il consiglio in questa domanda, sono in grado di grep ricorsivamente per una stringa string allinterno dei contenuti di una determinata directory dir come segue

grep -r --exclude-dir=".*" string dir 

Tuttavia, quando lo applico alla directory corrente, come

$ grep -r --exclude-dir=".*" string . $ 

non ottengo risultati, poiché --exclude-dir=".*" lopzione omette la directory corrente come nascosta poiché corrisponde a ".*".

Una soluzione è passare alla directory principale tramite cd .., quindi esegui il comando sul figlio appropriato, quindi cd di nuovo nella directory di lavoro originale. Deve esserci un singolo comando che posso utilizzare per eseguire questa operazione senza il work-around di cambiare directory.

Che cosè un singolo comando per grep content della directory corrente, omettendo i contenuti delle directory nascoste?

Risposta

Se stai usando GNU grep 2.11 o successivo, -r inizierà dalla directory corrente se non è specificata alcuna directory:

grep -r --exclude-dir=".*" string 

Commenti

  • Buono per aver incluso la nota sulla versione. Con BSD grep produce: grep: warning: recursive search of stdin

Risposta

In shell glob (noto anche come pattern di nome file), . non ha un significato speciale, * significa zero o più caratteri e ? indica un singolo carattere.

Ciò che desideri escludere è un punto seguito da almeno uno carattere, quindi un numero qualsiasi di caratteri. Quindi usa:

grep -r --exclude-dir=".?*" string . 

Risposta

Da bash non ha grep attraversare directory nascoste per impostazione predefinita (cioè senza dotglob abilitato:

$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo 

Escludi semplicemente i file nascosti:

$ grep --exclude=".*" -r foo * file:foo test/file:foo 

Commenti

  • Sono curioso di sapere il ragionamento alla base del voto negativo non commentato.
  • Non ho ' t voto negativo, ma ' non è vero che grep non ' t attraversa directory nascoste. Quello che ' visto con grep -r foo * è che shell glob * non ' t espandere per includere directory / file nascosti, a meno che dotglob non sia stato impostato con shopt -s dotglob. Prova con grep -r foo . e tu ' vedrà le directory nascoste sono attraversate da grep. Oppure prova con shopt -s dotglob e poi grep -r foo *.
  • Punto giusto; Lho chiarito nella mia risposta.
  • Questo continuerà a cercare i file nelle directory nascoste contenute negli argomenti della riga di comando. In qualche modo funzionerà. Nella maggior parte dei casi potrebbe andare bene, ma ' è come definire " pi " come " 3.1416 "; conosci meglio le avvertenze.

Risposta

Puoi anche specificare la directory corrente utilizzando $(pwd) come:

grep -r --exclude-dir=".*" string "$(pwd)" 

Commenti

Risposta

Per ricorrere in un singolo directory (non limitando i file nascosti delle directory secondarie) usa:

Poiché echo dir/* stamperà tutti i file allinterno di dir, questo funzionerà per i file allinterno di alcune directory:

$ grep -r "string" $(echo dir/*) 

cambia semplicemente dir in . (punto) e otterrai esattamente ciò che desideri:

$ grep -r "string" $(echo ./*) 

Se ciò che è necessario non sono file nascosti in nessuna delle sottodirectory, usa:

$ grep -r --exclude-dir=".*" "string" 

Oppure utilizza trova:

find . -not -path "*/\.*" -type f -exec grep "string" {} \+ 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *