Estoy ejecutando el siguiente comando para encontrar todos los archivos/directorios que no tienen nada que ver con "flash_drive_data":
find . -not -path './flash_drive_data*' | grep "./*flash*"
Hay algunas cosas que probé que me confunden:
1. Cuando ejecuto el comando anterior, obtengo algunos resultados "parciales" (es decir, no coinciden completamente con *flash*
patrón. Por ejemplo:
./.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
El 3/flas
al final está resaltado.
2. Cuando reemplacé grep "*flash*"
con solo grep "*"
, Esperaba obtener todos los archivos devueltos por find, pero no obtuve ninguno. ¿Por qué? Luego, cuando hice grep "**"
Creo que obtuve todos los archivos (o al menos eso creo). De nuevo, ¿por qué es eso?
3. Finalmente, el objetivo de lo que estaba haciendo anteriormente era asegurarme de que cuando ejecutara find . -not -path './flash_drive_data*'
No obtenía nada relacionado con flash_drive_data. Parecía que sí (con un comportamiento inesperado con grep como expliqué anteriormente). Sin embargo, cuando ejecuté:find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +
Estaba obteniendo resultados que incluían cosas como:
./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/
por lo que se incluyeron archivos flash_drive_data.
Respuesta aceptada:
find . -not -path './flash_drive_data*' | grep "./*flash*"
La cosa aquí es que grep
usa expresiones regulares, mientras que find -path
utiliza coincidencias de patrón de estilo global de shell. El asterisco tiene un significado diferente en esos dos.
La expresión regular ./*flash*
coincide primero con cualquier carácter (.
), luego cero o más barras (/*
), luego una cadena literal flas
, entonces cualquier número (cero o más) de h
caracteres. 3/flas
coincide con eso (con cero veces h
), y también lo haría, p. reflash
(con cero veces /
).
Podrías simplemente usar grep flash
en cambio, dado que coincide en cualquier parte de la entrada, por lo que las partes iniciales y finales de "coincidencia con cualquier cosa" son innecesarias.
O use find -path './*flash*' -and -not -path './flash_drive_data*'
Cuando reemplacé grep "*flash*"
con solo grep "*"
, no obtuve [ninguna coincidencia].
Dado que el asterisco significa "cualquier número del átomo anterior", no está muy bien definido aquí. grep
lo interpreta como un asterisco literal, pero en realidad debería ser un error.
Sin embargo, cuando ejecuté:find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +
Estaba obteniendo resultados que incluían cosas como:
./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/
entonces flash_drive_data
se estaban incluyendo archivos.
Tenga en cuenta que tar
almacena archivos recursivamente, y la primera salida de ese find
es .
para el directorio actual, por lo que todo se almacenará. ¡Quizás quieras usar ! -type d
con find
para excluir directorios de la salida, o (mejor), mire el -exclude=PATTERN
opciones para tar
.