Ik voer het volgende commando uit, maar het wordt niet recursief uitgevoerd:
find . -name *.java
Ik weet dat er verderop in de huidige directory Java-bestanden zijn, maar het voert de find
alleen uit op de huidige directory. Ik gebruik OS X, 10.9.
Antwoord
Het probleem is dat je je parameter. Doe dit in plaats daarvan:
find . -name "*.java"
Uitleg
Zonder de aanhalingstekens, interpreteert de shell *.java
als een glob-patroon en breidt het uit naar alle bestandsnamen die overeenkomen met de glob voordat het wordt doorgegeven naar find
. Op deze manier, als u bijvoorbeeld foo.java
in de huidige directory had, find
“s eigenlijke commandoregel zou zijn:
find . -name foo.java
die het bestand uiteraard alleen in de huidige directory zou vermelden (tenzij je toevallig een soortgelijk bestanden verderop in de boom).
Citeren voorkomt globale uitbreiding en geeft de opdrachtregel door aan find
as-is.
Overigens, als de glob kwam niet overeen (geen *.java
bestanden in de huidige map tory), zou je een van de twee gedragingen krijgen, afhankelijk van hoe je shell is ingesteld om klodders te verwerken die niet overeenkomen (dit wordt bepaald door de optie nullglob
in Bash, bijvoorbeeld ):
- Als een glob die niet “niet overeenkomt” niet wordt uitgebreid door de shell,
find
zal (per ongeluk, let wel) correct gedrag vertonen. - Als een glob die niet overeenkomt door de shell wordt uitgebreid tot een lege string, zal
find
klagen dat er een argument ontbreekt voor-name
.
Antwoord
Ik had een vergelijkbare situatie waarin ik me bevond -name waarde tussen aanhalingstekens, maar kreeg nog steeds niet alle vind-hits waar ik op hoopte. Ik vermoedde dat het kwam door symlinks en dat was inderdaad het geval. Als u zoeken wilt forceren om door symlinks te zoeken, kunt u de opdracht wijzigen in het volgende:
find -L . -name "*.java"
Commentaren
Antwoord
Ontsnap aan de *
find . -name \*.java
-follow
is een beter leesbaar synoniem voor-L
, zolang je het maar voor de andere parameters plaatst.