find -maxdepth 0 ne me renvoie aucune sortie

17

J'essaie de comprendre comment utiliser l' find -maxdepth 0option.

J'ai la structure de répertoire ci-dessous.

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

Maintenant, j'exécute ma findcommande comme ci-dessous.

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

Avec aucune des findcommandes ci-dessus , file1 est renvoyé.

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

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

J'ai cherché quelques exemples avec -maxdepth 0option et je n'ai trouvé aucun exemple approprié.

Ma findversion est,

find --version
find (GNU findutils) 4.4.2

Quelqu'un peut-il me fournir des conseils sur les cas où l' -maxdepth 0option serait utile?

ÉDITER

Lorsque j'exécute la commande ci-dessous, le fichier1 est répertorié deux fois. Est-ce destiné à fonctionner de cette façon?

find . file1 -maxdepth 1 -name "file1"
./file1
file1
Ramesh
la source

Réponses:

24

Supposons que nous ayons file1dans le répertoire courant. Alors:

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

Maintenant, regardons ce que dit la documentation:

-maxdepth 0 signifie uniquement appliquer les tests et 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. Puisque .n'a pas de nom file1, rien n'est répertorié dans la sortie. Dans mon deuxième exemple ci-dessus, les deux .et file1sont répertoriés sur la ligne de commande et, car file1correspond -name "file1", il a été renvoyé dans la sortie

En d'autres termes, -maxdepth 0signifie ne pas rechercher dans les répertoires ou 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 répertoriés sur la ligne de commande et aucun d'entre 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 findcommande 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

Chemins qui se chevauchent

Considérer:

$ 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, findsuivra chaque chemin spécifié sur la ligne de commande et recherchera des correspondances même si les chemins mènent au même fichier, comme dans . fileou même si les chemins sont des doublons exacts, comme dans file1 file1.

John1024
la source
Merci. Mais comment pourrais-je passer des noms de fichiers en ligne de commande?
Ramesh
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 *répertorie tous les fichiers du répertoire en cours sur la ligne de commande.
John1024
1
@Ramesh Answer mis à jour avec, je l'espère, de meilleures explications et exemples.
John1024
Merci encore. J'ai mis à jour ma question avec plus de détails de votre dernière mise à jour.
Ramesh
@Ramesh Je ne le trouve pas documenté mais je vois le même comportement que vous: findregarde chaque chemin sur la ligne de commande et rapporte les correspondances sur chacun même s'il s'agit de doublons.
John1024