find -exec macht nicht das, was die Find-Ausgabe vorschlägt

find -exec macht nicht das, was die Find-Ausgabe vorschlägt

Wenn ich dies mache find:

find ${TRIADS_DIR}/*.dc.results -path "*amblock/stats.*HEAD" -o -path "*amblock/stats.*BRIK"

dann bekomme ich in STDOUT, was ich erwarte:

tp101.day1.dc.results/amblock/stats.tp101_day1+tlrc.HEAD
tp101.day1.dc.results/amblock/stats.tp101_day1+tlrc.BRIK
tp101.day2.dc.results/amblock/stats.tp101_day2+tlrc.HEAD
tp101.day2.dc.results/amblock/stats.tp101_day2+tlrc.BRIK
...

Wenn ich eine -execKlausel zum Verknüpfen der gefundenen Dateien hinzufüge:

find ${TRIADS_DIR}/*.dc.results -path "*amblock/stats.*HEAD" -o -path "*amblock/stats.*BRIK" -exec ln -s {} ${TRIADS_GROUP} \;

dann verknüpft es nur die BRIKs:

stats.tp101_day1+tlrc.BRIK@
stats.tp101_day2+tlrc.BRIK@
...

Fragen

  • Was passiert?
  • Gibt es eine effizientere Möglichkeit, find mithilfe eines einzigen Platzhalterausdrucks anzuweisen, .HEAD und .BRIK zurückzugeben? Ich habe Dinge wie diese ausprobiert:

    find ${TRIADS_DIR}/*.dc.results -path "*amblock/stats.*{HEAD,BRIK}"
    

    aber ich habe es nicht zum Laufen gebracht.

Antwort1

Frage 1: Was ist los?

Sie -oteilen Ihre Argumente auf. Das -execläuft nur, wenn das Zeug auf der gleichen Seite von -oerfolgreich ist (das -path "*amblock/stats.*BRIK"). Wenn Sie -execunter beiden Bedingungen laufen möchten, müssen Sie sie in Klammern setzen:

find ${TRIADS_DIR}/*.dc.results \( -path "*amblock/stats.*HEAD" -o -path "*amblock/stats.*BRIK" \) -exec ln -s {} ${TRIADS_GROUP} \;

 

Frage 2: Gibt es eine effizientere Möglichkeit, find mithilfe eines einzigen Platzhalterausdrucks anzuweisen, .HEAD und .BRIK zurückzugeben?

Nein, irgendwie schon. Einige findImplementierungen haben ein -regexnicht standardmäßiges Prädikat, das Sie stattdessen verwenden könnten, aber ich würde das nicht als „effizienter“ bezeichnen.

verwandte Informationen