commande find sous Linux pour localiser les fichiers pdf

11

Mon objectif est de trouver tous les fichiers pdf sur une machine distante, j'ai donc recours à la commande utile find. Alors je tape

trouver ~ * .pdf
ou
trouver ~ "* .pdf"
et je ne reçois rien. Je fais de même sur ma machine et je ne reçois rien. Je fais une recherche régulière depuis le menu de ma machine et je trouve pas mal de fichiers pdf. Quelqu'un pourrait-il me dire ce que je fais mal?

akira
la source
11
Gardez vos opinions négatives en dehors de votre question si vous voulez une bonne réponse. Dans une histoire connexe, findest loin d'être inutile.
wilhelmtell
8
Bien sûr, vous avez le droit à la liberté d'expression. Mais vous voulez une bonne réponse, non? Non, vous n'avez pas le droit de recevoir une bonne réponse constructive. C’est un privilège.
wilhelmtell
2
Un mauvais ouvrier blâme toujours ses outils. En d'autres termes, pur PBCAK ici.
Pascal Thivent
5
@Wilhelmtell, je pense que la déclaration de Martin est juste - la commande n'aurait jamais dû être nommée "find" en premier lieu, plus comme "walkpath_and_execute" ... elle n'a pas l'interface la plus intuitive ou conviviale et en fait beaucoup plus que de simplement trouver des fichiers. Le simple nom "find" est trompeur en ce qu'il suggère une interface simple qu'il n'a pas. Bien sûr, trouver est loin d'être inutile et fonctionne assez bien, mais on peut difficilement reprocher à un débutant de ne pas faire la différence entre "trouver", "localiser", "qui", etc.
Michael Aaron Safyan
1
@Michael Je n'ai blâmé personne ici; ou plutôt, ce n'est pas moi qui fais le blâme ici. Je n'ai même pas dit que findc'était intuitif. Je pourrais probablement dire la même chose sur un ton plus gentil; parfois je réagis à des commentaires (stupides) négatifs.
wilhelmtell

Réponses:

30

findest loin d'être inutile. Vous ne l'utilisez pas correctement.

essayer:

find . -type f -iname '*.pdf'

Mitch Dempsey
la source
@Martin - Heureux de vous aider, assurez-vous simplement de marquer la question comme répondue!
Mitch Dempsey
@stepancheg Oui, pourquoi ne pas supprimer Internet et imprimer une copie papier.
bobobobo
9

Jetez un œil à la documentation des findutils . La findcommande est incroyablement puissante et, par conséquent, possède une interface quelque peu compliquée. Vous pouvez faire ce que vous voulez avec:

find . -type f -iname '*.pdf' 

La commande ci-dessus signifie "rechercher dans. Pour les entrées de type fichier avec un nom insensible à la casse correspondant à * .pdf (et imprimer le nom de ces correspondances)". La commande find peut en fait être utilisée pour exécuter des commandes sur les fichiers trouvés (au lieu ou en plus d'imprimer les noms de fichiers). Pour vos besoins, cependant, vous pouvez vous sentir plus à l'aise avec la commande Locate , qui - en supposant que vous avez créé la base de données de localisation à l'aide de updatedb - facilite la recherche de fichiers. Par exemple:

locate '*.pdf'

Vous constaterez également que la commande Locate est généralement plus rapide que la commande find, car Locate utilise un index des noms de fichiers (la base de données Locate), tandis que find parcourt la hiérarchie pour chaque appel.

Michael Aaron Safyan
la source
6

Vous manquez simplement le prédicat qui indique ce que vous recherchez (par exemple -name.)

Pour rechercher dans le répertoire personnel par nom:

find ~ -name \*.pdf

Notez que le caractère générique *doit être échappé afin que le shell ne l'interprète pas avant que find ne lui mette la main dessus. L'utilisation de '*.pdf'et "*.pdf"aura le même effet que \*.pdf.

Pour rechercher sans tenir compte de la casse:

find ~ -iname \*.pdf

Pour élaguer les résultats aux fichiers uniquement (l'expression de nom s'en occupera probablement pour vous, mais juste au cas où vous auriez des répertoires aux noms étranges):

find ~ -type f -iname \*.pdf

Pour vous assurer que find suit les liens symboliques (je veux généralement le faire moi-même lorsque je fais des recherches):

find ~ -follow -type f -iname \*.pdf

Pour faire quelque chose avec les fichiers que vous avez trouvés: vous pouvez les vider dans un fichier en utilisant la redirection stdout (par exemple tack on > filenameà la fin), ou utiliser l' -execoption pour exécuter une commande (voir la page de manuel pour plus de détails). Cependant, ce dernier exécute une commande sur chaque fichier à la fois. il est souvent plus rapide de laisser la xargscommande passer vos fichiers trouvés comme arguments à une autre commande, en une seule fois ou en gros morceaux à la fois. Par exemple, pour les greps ad hoc (mais non indexés) via les fichiers d'en-tête:

find ~ -follow -type f -name \*.h | xargs grep -nH "identifier"

Et une dernière extension, pour que cette dernière commande fonctionne correctement si vous avez des fichiers et des répertoires avec des espaces:

find ~ -follow -type f -name \*.h -print0 | xargs -0 grep -nH "identifier"
Owen S.
la source
En fait, "* .pdf" se développerait s'il y a des fichiers dans le répertoire courant se terminant par .pdf, non? (note mineure)
Peter Jaric
1
Pas en bash. Extrait du manuel bash: "Le fait de placer des caractères entre guillemets doubles préserve la valeur littérale de tous les caractères entre guillemets, à l'exception de [dollar], [guillemet arrière], [pipe] et, lorsque l'expansion de l'historique est activée, [bang]. " Essayez-le vous-même pour confirmer: ls "* .txt" sur un répertoire contenant des fichiers texte.
Owen S.
Oui, vous avez raison, bien sûr. Je ne sais pas d'où vient cette idée. Merci de m'avoir corrigé.
Peter Jaric
3

jetez un oeil à ce tutoriel

je pense que ce que tu veux faire c'est

find . -name "*.pdf"

la source
Vous devriez utiliser l' inameattribut pour une meilleure vision du couloir
Mitch Dempsey
0

J'avais l'habitude de combiner la recherche avec grep comme

trouver . . | grep -i ".pdf"

n'est peut-être pas très efficace, mais il fait très bien l'affaire.

Tiberiu Hajas
la source
Cela pourrait se faire en finddirect si vous désiriez, via -iregex: find ~ -iregex '.*\.pdf'. Le problème est que findle motif est traité comme il a toujours un ^devant et un $derrière, donc votre motif doit être un peu plus compliqué. Notez également que .dans votre modèle se trouve en fait un caractère générique à caractère unique, et non une période littérale.
Owen S.
0

Trouvez les fichiers dont vous avez besoin téléchargés au cours des x derniers jours

find ~ -type f -iname '*.pdf' -mtime -1

vous trouvera des fichiers pdf dans votre ~répertoire personnel et ci-dessous avec une extension .pdfindépendamment des majuscules et minuscules (c'est i iname) et modifiés il y a 1 jour car j'ai ajouté mtime -1; si vous mettez -60 dans mtime, ce sera les 60 derniers jours.

r0berts
la source
0

Pour exécuter une recherche dans les fichiers "trouvés", il y a cette construction:

find <dir> -type f -iname <name> -exec grep -H <string> {} \;

La commande exec doit se terminer par le caractère d'échappement ";" et le -H est nécessaire pour que grep imprime le chemin du fichier en plus de la ligne dans le fichier où se trouve "string".

Ted Ballou
la source