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 .