J'exécute la commande suivante afin de trouver tous les fichiers/répertoires qui n'ont rien à voir avec "flash_drive_data":
find . -not -path './flash_drive_data*' | grep "./*flash*"
Il y a quelques choses que j'ai essayées qui me déroutent :
1. Lorsque j'exécute la commande ci-dessus, j'obtiens quelques résultats "partiels" (c'est-à-dire qu'ils ne correspondent pas complètement au *flash*
modèle. Par exemple :
./.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
Le 3/flas
à la fin est en surbrillance.
2. Lorsque j'ai remplacé grep "*flash*"
avec juste grep "*"
, je m'attendais à ce que tous les fichiers soient renvoyés par find, mais je n'en ai eu aucun. Pourquoi? Ensuite, quand j'ai fait grep "**"
Je crois que j'ai obtenu tous les fichiers (ou du moins je pense que je l'ai fait). Encore une fois, pourquoi ?
3. Enfin, l'objectif de ce que je faisais ci-dessus était de m'assurer que lorsque j'exécutais find . -not -path './flash_drive_data*'
Je n'obtenais rien concernant flash_drive_data. Il semblait que je l'ai fait (avec un comportement inattendu avec grep comme je l'ai expliqué ci-dessus). Cependant, lorsque j'ai exécuté :find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +
J'obtenais une sortie comprenant des éléments tels que :
./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/
donc les fichiers flash_drive_data étaient inclus.
Réponse acceptée :
find . -not -path './flash_drive_data*' | grep "./*flash*"
Le truc ici est que grep
utilise des expressions régulières, tandis que find -path
utilise des correspondances de modèle de style shell glob. L'astérisque a une signification différente dans ces deux cas.
L'expression régulière ./*flash*
correspond en premier à n'importe quel caractère (.
), puis zéro ou plusieurs barres obliques (/*
), puis une chaîne littérale flas
, puis n'importe quel nombre (zéro ou plus) de h
personnages. 3/flas
correspond à cela (avec zéro fois h
), et il en serait de même par ex. reflash
(avec zéro fois /
).
Vous pouvez simplement utiliser grep flash
au lieu de cela, étant donné qu'il correspond n'importe où dans l'entrée, les parties de début et de fin "correspondant à n'importe quoi" ne sont donc pas nécessaires.
Ou utilisez find -path './*flash*' -and -not -path './flash_drive_data*'
Quand j'ai remplacé
grep "*flash*"
avec justegrep "*"
, j'ai [aucune correspondance].
Puisque l'astérisque signifie "n'importe quel nombre de l'atome précédent", il n'est pas vraiment bien défini ici. grep
interprète cela comme un astérisque littéral, mais en réalité, il devrait s'agir d'une erreur.
Cependant, lorsque j'ai exécuté :
find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +
J'obtenais une sortie comprenant des éléments tels que :
./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/
donc
flash_drive_data
les fichiers étaient inclus.
Notez que tar
stocke les fichiers de manière récursive, et la première sortie de ce find
est .
pour le répertoire courant, donc tout sera stocké. Vous voudrez peut-être utiliser ! -type d
avec find
pour exclure des répertoires de la sortie, ou (mieux), regardez le -exclude=PATTERN
options pour tar
.