279 votes

Comment trouver un fichier par son nom dans le terminal Mac OSX ?

Je veux trouver un fichier sur mon Macbook avec le nom de fichier : abc.dmg . J'ai essayé d'utiliser spotlight, mais il ne le trouve pas. Quand j'ai essayé de trouver, et utilisé : find -name abc.dmg -path / j'ai reçu des erreurs en retour.

Quelle est la syntaxe correcte pour trouver un fichier par nom de fichier avec la commande find sur un terminal Mac OSX ?

1 votes

@VxJasonxV Les questions relatives à Apple sont 100% dans le sujet de Super User, et il n'est pas vraiment nécessaire que toutes les questions relatives à Apple y soient déplacées. Les questions relatives à l'iPhone ou à l'iPad seront cependant déplacées quand/si nécessaire.

1 votes

Ce n'était pas tant une raison d'être hors sujet, mais le fait qu'il existe un sujet/site plus spécifique pour ce sujet général.

1 votes

@Diago : Y a-t-il eu une discussion à ce sujet sur meta ou sur le chat ? Je me demande juste parce que, selon l'AFAIK, apple.SE va bientôt sortir de sa phase bêta, et il serait bon que tout le monde soit sur la même longueur d'onde.

3voto

Samir Points 141

Vous pouvez utiliser les fonctions de ligne de commande suivantes pour trouver et ouvrir rapidement le fichier concerné. Je trouve cela plus facile que de taper une longue chaîne de requête dans la fenêtre Spotlight.

Ajouter les fonctions suivantes dans ~/.bash_aliases .

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='*$1*'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd" | sed -n "${FILEID}")"

}

Maintenant, soit source ~/.bash_aliases ou ouvrez un nouveau terminal fonctions de charge. Pour rechercher des fichiers contenant les mots, pie et 2016 n'importe où dans le nom du fichier, faites

spot pie*2016 #or
spot 2016*pie

Il n'y a pas besoin de précéder ou d'ajouter * à votre requête comme modèle de recherche, '*$1*' les balises déjà entrées en tant que joker au début et à la fin de votre requête. Autres sites cd est pour l'insensibilité à la casse et l'ignorance des signes diacritiques, par exemple, fred retournera les deux, Frédéric et FrEDeric.

findpaper limitera la recherche aux résultats sous un chemin spécifique (récursif) alors que openpaper pie*201 ouvrira un résultat de recherche (ou le premier de plusieurs résultats) ou openpaper pie*201 3 ouvrira l'entrée du troisième résultat. Pour éviter d'ouvrir des bash scripts ou d'autres fichiers non documentaires, vous pouvez restreindre le contenu des fichiers par des attributs de recherche supplémentaires. Voir Syntaxe d'expression de requête de métadonnées de fichier y https://ss64.com/osx/mdfind.html pour l'utilisation d'autres opérateurs de recherche.

0 votes

Génial ! Je l'arrête :D

2voto

Joerg Points 974

Capturez une liste de tous les fichiers sur votre disque en tant que root à partir de /

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

Passez le fichier entier à travers grep pour rechercher le disque entier :

cat ~/file-list.txt | grep abc.dmg

Utilisez des expressions régulières pour afficher uniquement les fichiers .jpg et .dmg :

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"

Résultat :

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg

...etc. Malheureusement, cela va aussi capturer tous les disques montés, il est donc préférable d'éjecter ceux de Time Machine qui ont beaucoup de liens. Dans une autre fenêtre, je lance donc watch tail -n 10 ~/file-list.txt ce qui me montre où il en est dans mon odieux piratage !

2 votes

Mauvaises pratiques ou choses qui méritent un commentaire : (1) sudo find / > ~/file-list.txt semble mieux que de lancer l'intégralité du Shell en tant que root. (2) find * sautera les objets cachés (points) (s'il y en a) dans le fichier / . (3) &> est un bashisme. (4) Utilisation inutile de cat . (5) grep abc.dmg imprimera par exemple /foo/bar/123abcXdmg456/baz/whatever . // Une bonne chose que votre réponse apporte à ce fil de discussion (et que les autres réponses n'apportent pas) est l'approche où l'utilisateur exécute find une fois et réutilise ensuite le résultat sauvegardé plusieurs fois sans interroger le(s) système(s) de fichiers encore et encore. Cet avantage potentiel n'est cependant pas accentué.

0 votes

Bon point merci Kamil, j'ai fait cela et aussi chown $(whoami)

1voto

G M Points 263

Opération de saut non autorisée

Le problème quand on utilise find dans la racine du styem d'exploitation, c'est qu'il faut alors trouver le résultat entre beaucoup d'erreur d'opération non autorisée. Ce grep peut limiter le nombre d'erreur à seulement "No such file or directory".

sudo find / -name abc.dmg  2>&1 | grep -v "Operation not permitted"

4 votes

Ou vous pouvez simplement rejeter les erreurs en utilisant find / -name abc.dmg 2> /dev/null qui redirige le flux d'erreur standard vers le seau de bits.

0voto

Stef Joosten Points 101

Dans votre terminal, utilisez

man find

pour obtenir le manuel complet de la find pour la version spécifique de votre système d'exploitation.

-1voto

nilon Points 101
  • Installer homebrew :

  • /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

  • Installer détecteur de fausses pistes :

  • brew install fzf

  • Accès fzf par le terminal :

  • fzf

  • Insérez la requête (vous trouverez des résultats dès que vous commencerez à écrire vos premières lettres) :

  • name with spaces and details you remember (add format for more detail)

  • Accès au chemin complet du fichier.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X