Est-il possible de rechercher une combinaison répertoire / fichier?


12

J'ai besoin de trouver une image, disons ABC.jpg, dont je sais qu'elle aura été placée par programme dans un répertoire nommé ABC_MPSC. J'ai essayé:

cd /
find . -name "ABC_MPSC/ABC.jpg"

Mais cela ne renvoie rien (je sais en fait où se trouve celui que je recherche, donc je sais qu'il existe). Existe-t-il une commande find qui pourrait me permettre de ne pas avoir à rechercher manuellement?



2
Vous pouvez également le trouver en utilisant locate, ce qui devrait être beaucoup plus rapide, mais ne fonctionne que si le fichier existait déjà lors de updatedbsa dernière exécution.
Simon Richter

Réponses:


17

Il y a un -pathprédicat qui est utile ici:

find . -path '*/ABC_MPSC/ABC.jpg'

La description POSIX pour ce prédicat est:

Le primaire doit évaluer comme vrai si le chemin d'accès actuel correspond au modèle en utilisant la notation de correspondance de modèle décrite dans la notation de correspondance de modèle. Les règles supplémentaires dans les modèles utilisés pour l'extension de nom de fichier ne s'appliquent pas car il s'agit d'une opération de correspondance et non d'une extension.

La raison de votre -name "ABC_MPSC/ABC.jpg"échec est que le -nameprédicat:

doit être évalué comme vrai si le nom de base du chemin d'accès actuel correspond au modèle

En d'autres termes, -namene voit jamais le répertoire du nom de fichier actuel, uniquement le nom de fichier de base lui-même (ABC.jpg, par exemple).


10

Deux façons (en dehors de l' utilisation-path ):

  1. Recherchez le répertoire, puis détectez le fichier:

    find / -type d -name 'ABC_MPSC' -exec test -f {}/ABC.jpg \; -print
    

    Cela s'appuie sur l' findimplémentation pour s'étendre {}au chemin d'accès actuel du répertoire trouvé, même s'il est concaténé avec /ABC.jpg(ce n'est pas obligatoire pour cela). Il pourrait également s'écrire

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. Recherchez le fichier, puis vérifiez son nom de répertoire parent:

    find / -type f -name 'ABC.jpg' -exec sh -c '
        case $(dirname "$1") in
            */ABC_MPSC) exit 0 ;;
            *) exit 1
        esac' sh {} \; -print
    

Ces deux alternatives seraient plus lentes que de les utiliser -pathcomme Jeff le montre. Je les laisse ici à titre d'exemples, car ils pourraient éventuellement être adaptés à d'autres choses.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.