Jessaie de comprendre comment utiliser loption find -maxdepth 0.

Jai la structure de répertoires ci-dessous.

--> file1 --> parent --> child1 --> file1 --> file2 --> child2 --> file1 --> file2 --> file1 

Maintenant, jexécute ma commande find comme ci-dessous.

find ./parent -maxdepth 0 -name "file1" find ./ -maxdepth 0 -name "file1" find . -maxdepth 0 -name "file1" 

Sans aucune des commandes find ci-dessus, file1 est renvoyé.

De la page de manuel de find, je vois les informations ci-dessous.

-maxdepth 0 signifie appliquer uniquement les tests et les actions aux arguments de la ligne de commande.

Jai cherché des exemples avec loption -maxdepth 0 et je nai pas pu trouver dexemple approprié.

Mon find version est,

find --version find (GNU findutils) 4.4.2 

Quelquun peut-il me fournir des indications sur les cas -maxdepth 0 option serait utile ?

EDIT

Lorsque jexécute la commande ci-dessous, jobtiens le file1 être répertorié deux fois. Est-ce que cela fonctionne de cette façon?

find . file1 -maxdepth 1 -name "file1" ./file1 file1 

Réponse

Supposons que nous ayons file1 dans le répertoire courant. Ensuite :

$ find . -maxdepth 0 -name "file1" $ find . file1 -maxdepth 0 -name "file1" file1 

Voyons maintenant ce que dit la documentation:

-maxdepth 0 signifie onl y appliquer les tests et les actions aux arguments de la ligne de commande.

Dans mon premier exemple ci-dessus, seul le répertoire . est répertorié sur la ligne de commande. Étant donné que . na pas le nom file1, rien nest répertorié dans la sortie. Dans mon deuxième exemple ci-dessus, . et file1 sont répertoriés sur la ligne de commande et, car file1 correspond à -name "file1", il a été renvoyé dans la sortie

En dautres termes, -maxdepth 0 signifie faire pas rechercher des répertoires ou des sous-répertoires. Au lieu de cela, recherchez uniquement un fichier correspondant parmi ceux explicitement répertoriés sur la ligne de commande.

Dans vos exemples, seuls les répertoires étaient listés sur la ligne de commande et aucun dentre eux nétait nommé file1. Par conséquent, aucune sortie.

En général, de nombreux fichiers et répertoires peuvent être nommés sur la ligne de commande. Par exemple, nous essayons ici une commande find avec 11 fichiers et répertoires sur la ligne de commande:

$ ls d1 file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 $ find d1 file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 -maxdepth 0 -name "file1" file1 

Chevauchement chemins

Considérez:

$ find . file1 -maxdepth 0 -iname file1 file1 $ find . file1 file1 -maxdepth 0 -iname file1 file1 file1 $ find . file1 file1 -maxdepth 1 -iname file1 ./file1 file1 file1 

Apparemment, comme le souligne Ramesh, find suivra chaque chemin spécifié sur la ligne de commande et recherchez les correspondances même si les chemins mènent au même fichier, comme dans . file ou même si les chemins sont des doublons exacts, comme dans file1 file1.

Commentaires

  • merci. Mais comment pourrais-je passer certains noms de fichiers en ligne de commande?
  • Bon point. Voir ma réponse mise à jour. Vous pouvez en mettre autant que vous le souhaitez avant le premier test. Par exemple: find * -maxdepth 0 -name "file1". Le * listera tous les fichiers du répertoire courant sur la ligne de commande.
  • @Ramesh Réponse mise à jour à nouveau avec, je lespère, une meilleure explication et des exemples.
  • merci encore. Jai mis à jour ma question avec plus de détails sur votre dernière mise à jour.
  • @Ramesh Je ne la trouve pas documentée mais je constate le même comportement que vous: find regarde chacun chemin sur la ligne de commande et signale les correspondances sur chacun deux même sil sagit de doublons.

Réponse

Si vous souhaitez rechercher de manière non récursive des fichiers (pas des répertoires) dans un répertoire, utilisez:

 find . -maxdepth 1 -type f -name "file1" # ./file1  

-maxdepth 0 ne recherchera pas . Il essaiera uniquement de faire correspondre les noms de fichiers / répertoires que vous avez fournis comme arguments dans find. Par exemple. dans linstruction ci-dessus, en utilisant une valeur 0, essaierait de faire correspondre file1 à . qui ne correspond pas. Passer * au lieu de . ferait que bash remplacerait * par la liste des fichiers dans le répertoire actuel qui renverrait une correspondance.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *