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
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 congrep -r foo *
è che shell glob*
non ' t espandere per includere directory / file nascosti, a meno chedotglob
non sia stato impostato conshopt -s dotglob
. Prova congrep -r foo .
e tu ' vedrà le directory nascoste sono attraversate da grep. Oppure prova conshopt -s dotglob
e poigrep -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
- Cita la sostituzione del comando:
"$(pwd)"
Vedi anche Perché il mio script di shell si blocca su spazi o altri caratteri speciali?
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" {} \+
grep
produce:grep: warning: recursive search of stdin