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
.