GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Confuso su Grep e il * jolly?

Sto eseguendo il seguente comando per trovare tutti i file/directory che non hanno nulla a che fare con "flash_drive_data":

find . -not -path './flash_drive_data*' | grep "./*flash*"

Ci sono alcune cose che ho provato che mi confondono:

1. Quando eseguo il comando precedente, ottengo alcuni risultati "parziali" (cioè non corrispondono completamente a *flash* modello. Ad esempio:

./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/cli.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/signals.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/templating.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/sessions.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json/tag.pyi

Il 3/flas alla fine viene evidenziato.

2. Quando ho sostituito grep "*flash*" con solo grep "*" , mi aspettavo di ricevere tutti i file restituiti da find, ma non ne ho ricevuto nessuno. Come mai? Poi, quando ho fatto grep "**" Credo di aver ottenuto tutti i file (o almeno credo di averlo fatto). Ancora una volta, perché?

3. Infine, l'obiettivo di quello che stavo facendo sopra era assicurarsi che quando ho eseguito find . -not -path './flash_drive_data*' Non stavo ottenendo nulla relativo a flash_drive_data. Sembrava di averlo fatto (con qualche comportamento inaspettato con grep come ho spiegato sopra). Tuttavia, quando ho eseguito:
find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +

Stavo ricevendo un output che includeva cose come:

./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/

quindi i file flash_drive_data venivano inclusi.

Risposta accettata:

find . -not -path './flash_drive_data*' | grep "./*flash*"

La cosa qui è che grep usa espressioni regolari, mentre find -path utilizza corrispondenze di modelli in stile shell glob. L'asterisco ha un significato diverso in questi due.

L'espressione regolare ./*flash* corrisponde prima a qualsiasi carattere (. ), quindi zero o più barre (/* ), quindi una stringa letterale flas , quindi qualsiasi numero (zero o più) di h caratteri. 3/flas corrisponde a quello (con zero volte h ), e così sarebbe ad es. reflash (con zero volte / ).

Potresti semplicemente usare grep flash invece, dato che corrisponde a qualsiasi punto dell'input, quindi le parti iniziali e finali "corrisponde a qualsiasi cosa" non sono necessarie.

Oppure usa find -path './*flash*' -and -not -path './flash_drive_data*'

Quando ho sostituito grep "*flash*" con solo grep "*" , non ho [nessuna corrispondenza].

Poiché l'asterisco significa "qualsiasi numero dell'atomo precedente", qui non è molto ben definito. grep lo interpreta come un asterisco letterale, ma in realtà dovrebbe essere un errore.

Tuttavia, quando ho eseguito:find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' + Stavo ricevendo un output che includeva cose come:

./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/

quindi flash_drive_data i file venivano inclusi.

Nota che tar memorizza i file in modo ricorsivo e il primo output di quel find è . per la directory corrente, quindi tutto verrà archiviato. Potresti voler usare ! -type d con find per escludere le directory dall'output, o (meglio), guarda il -exclude=PATTERN opzioni per tar .


Ubuntu
  1. Trova i file e le directory più grandi in Linux

  2. Trova l'indirizzo MAC in Ubuntu 21.10

  3. Limitare l'uscita di ricerca ed evitare il segnale 13?

  4. Grep per più stringhe nei file e quindi elencare i file nell'ordine delle dimensioni?

  5. Taglia / Grep e Df -h?

Come trovare una stringa o una parola specifica in file e directory

Trova la riga di comando?

Come trovare il PID e il PPID di un processo in Linux

Confuso su stdin, stdout e stderr?

Qual è il significato di fork() e grep in Linux?

Come trovare informazioni sulla RAM?