GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Confus à propos de Grep et du * joker ?

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 juste grep "*" , 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 .


Ubuntu
  1. Rechercher des fichiers et des répertoires sous Linux avec la commande find

  2. Trouver l'adresse MAC dans Ubuntu 21.10

  3. Limiter la sortie de recherche et éviter le signal 13 ?

  4. Recherche de fichiers exécutables à l'aide de ls et grep

  5. Quelle est la signification de fork() et grep sous Linux ?

Comment trouver une chaîne ou un mot spécifique dans les fichiers et les répertoires

Trouver la ligne de commande ?

Comment trouver le PID et le PPID d'un processus sous Linux

Confus à propos de stdin, stdout et stderr ?

Quelle est la différence entre "localiser" et "trouver" sous Linux ?

Comment trouver des informations sur la RAM?