Terminal : comment copier tous les PDF des Documents dans un dossier ?

Nicolas Furno |

Comment récupérer tous les fichiers d’un certain format dans un dossier pour les copier dans un autre dossier ? C’est la question posée par un utilisateur sur nos forums et plusieurs réponses ont été proposées. La meilleure sélectionnée par le créateur du sujet implique de passer par les dossiers intelligents du Finder.

Initiez une recherche dans le dossier où vous voulez chercher les documents, choisissez un paramètre de type (1) pour filtrer les documents, puis enregistrez la recherche (2). Par défaut, ce dossier intelligent sera ajouté à la barre latérale du Finder, sur la gauche. Il ne reste plus ensuite qu’à copier toute la liste de fichiers pour les coller dans le dossier cible. Voici ce que cela donnerait pour récupérer tous les PDF des Documents :

N’importe quelle recherche effectuée dans le Finder peut être mémorisée et devenir un dossier intelligent. Ici, on liste tous les fichiers PDF situés dans le dossier Documents de la session en cours. Cliquer pour agrandir

C’est une solution efficace si on ne veut mener l’opération qu’une seule fois. Si vous avez besoin régulièrement de copier tous les PDF situés dans vos documents pour les coller dans un autre dossier, vous allez vite trouver cette méthode manuelle très contraignante.

C’est là que le terminal prend l’avantage. Ce genre de tâches simples et répétitives peut facilement être automatisé à condition de connaître la bonne ligne de commande. Voici celle que vous devriez saisir dans le terminal si vous voulez lister tous les fichiers PDF de votre dossier Documents et les copier dans un dossier, placé ici sur le bureau.

mdfind -onlyin ~/Documents/ "type:PDF" | xargs -I{} cp {} ~/Desktop/PDF

Pour changer les paramètres, vous pouvez modifier le dossier de recherche (~/Documents/ dans mon exemple) et celui de sortie (~/Desktop/PDF dans ce cas). Rappelons que le symbole ~ sert de raccourci pour designer le dossier personnel de votre session, le dossier représenté par la maison dans le Finder.

La commande mdfind utilisée ici permet d’exploiter la base de données de Spotlight pour chercher les fichiers. Dans ce cas, deux paramètres ont été ajoutés : une restriction à un seul dossier (par défaut, la recherche se fera sur tout le volume de stockage) et une restriction de format de fichiers entre guillemets. La liste complète des types disponibles est proposée par Apple à cette adresse.

Vous pouvez utiliser tous les paramètres accessibles également dans l’interface de l’outil de recherche. Pour sélectionner les fichiers à copier/coller par leur nom plutôt que par leur type, vous pouvez utiliser le paramètre "nom:nom-du-fichier". D’autres paramètres sont aussi disponibles, comme la date et vous pouvez combiner plusieurs paramètres et utiliser les opérateurs booléens (AND, OR…) pour affiner encore une recherche.

La ligne de commande en action : tous les PDF stockés dans les documents ont été copiés dans ce dossier. Cliquer pour agrandir

La deuxième partie de la commande sert à transmettre les résultats de la recherche Spotlight et d’en faire quelque chose. | xargs fait le lien entre les deux parties, et on utilise ici la commande cp qui permet de copier/coller des fichiers. En fonction de vos besoins, vous pourriez modifier la commande, par exemple en utilisant mv ce qui aurait alors comme effet de les déplacer dans le dossier cible (équivalent d’un glisser/déposer, ou d’un couper/coller).

Dernière précision, la commande cp copie tous les documents et les colle même s’ils existent déjà. Ajoutez le paramètre -n pour ne copier/coller que les nouveaux fichiers :

mdfind -onlyin ~/Documents/ "type:PDF" | xargs -I{} cp -n {} ~/Desktop/PDF

Si vous avez besoin d’effectuer régulièrement cette commande, vous pouvez la mémoriser avec un gestionnaire d’abréviations, ou bien la stocker dans un workflow avec Alfred, ou encore la placer dans un AppleScript ou créer un service avec Automator. Pour rester dans le terminal, mémoriser la commande sous la forme d’un alias est une excellente solution.

Pour en savoir plus sur le terminal, notre livre Tout savoir sur : Le terminal est disponible pour 4,99 €. Il s’adresse aux utilisateurs de macOS de tous les niveaux, même les débutants qui n’ont jamais ouvert le terminal auparavant.

avatar iPop | 

Pour moi c'est recherche : ".PDF"
Glisser/déposer/ALT dans un autre dossier

Ouvrir une application et une ligne de code c'est quand même assez long.

avatar Nicolas Furno | 

@iPop

Ça l'est si c'est un besoin unique. Tout l'intérêt du terminal, c'est dans la répétition des tâches.

Un alias et vous pouvez refaire la même manipulation plus rapidement que n'importe quelle autre méthode.

avatar BeePotato | 

@ Nicolas Furno : « Tout l'intérêt du terminal, c'est dans la répétition des tâches. »

Non, pas vraiment. C’est plus dans la souplesse de construction de solutions complexes.

« Un alias et vous pouvez refaire la même manipulation plus rapidement que n'importe quelle autre méthode. »

Ben non, pas dans ce cas précis. On refera la manipulation encore plus vite en passant par Automator, par exemple.

L’exemple de commande présenté ici était sympa et c’est une bonne idée de montrer ce qui peut être fait via un terminal. Mais la tentative de justification de cette approche par un gain de temps ou une plus grande facilité de répétition est boiteuse.

avatar ovea | 

@BeePotato

Ce qui serait boiteux serait de ne pas utiliser les outils de l'interface graphique, en l'occurrence les résultats de Spotlight, une fois dans le terminal …

Au contraire, c'est tout sauf boiteux puisque ça permet de commencer à s'affranchir du découpage entres deux langages graphique/terminal qui sont totalement équivalents …

Ça serait boiteux si il ne restait qu'à dire que c'est vrai de façon constructive sans le faire !

avatar BeePotato | 

@ ovea : « Ce qui serait boiteux serait de ne pas utiliser les outils de l'interface graphique, en l'occurrence les résultats de Spotlight, une fois dans le terminal … »

En effet (et c’est un des points très positifs de cet article : utiliser mdfind et non un simple find). Et à ce sujet, je regrette qu’Apple ne facilite pas l’accès depuis le terminal aux résultat d’une recherche enregistrée (un « dossier intelligent »).

Mais ça n’a rien à voir avec ce que je reprochais à l’article et ça ne change rien à ce que je disais. :-)

« Au contraire, c'est tout sauf boiteux puisque ça permet de commencer à s'affranchir du découpage entres deux langages graphique/terminal qui sont totalement équivalents … »

Manifestement, tu n’as pas saisi ce dont je parlais.

avatar ovea | 

@BeePotato

L'essentiel n'est pas dans l'automatisation abstraite pour un gain de temps lors de l'exécution puisque c'est un acquis, mais dans la possibilité unique d'enregistrer les interactions utilisateurs pour les rejouer tel un didacticiel avec en plus un script modifiable de façon interactive, comme on fait du montage sur la bande temporel … et que cela puisse être transposé en batch dans le terminal sans interactions avec l'interface de l'utilisateur.

Automator ne le permettra jamais en restant dans son coin, et le terminal aussi.
Le seul gain de temps oblige le mélange des genres en l'absence de solution d'intégration de la part d'Apple

avatar sinbad21 | 

Je trouve aussi que c'est plus vite fait en passant par le Finder.

avatar stefhan | 

Très instructif !

avatar occam | 

Nicolas : votre manuel est excellent, même pour un vieux briscard d'Unix comme moi.

Grâce à vous, j'ai été en mesure de reprendre une vieille coutume du temps des *nix "nus" : répondre aux demandes relatives au Terminal par la référence de votre iBook et un simple "RTFM !".

Plus clair et plus parlant qu'une manpage.

avatar Nicolas Furno | 

@occam

Merci pour les compliments. Et les recommandations ! ?

avatar Armand07 | 

Je vois que dans ma collection j'aimerai avoir un iBook MacG sur Automator ...

avatar marenostrum | 

il suffit de trier par Type

avatar matyo | 

mv ~/Documents/*.pdf ~/Documents/PDF ?? Simple, efficace

avatar sebasto72 | 

@matyo

Ta commande n'est pas récursive, elle ne va pas aller rechercher les fichiers dans les sous-répertoires.

avatar Rictusi | 

Quel est l'intérêt de passer par le finder dans ce cas ci ? Je me demande s'il y a un avantage, est-ce plus rapide ? Plus ouvert ? Plus simple selon vous ? Je suis curieux de savoir n'étant pas un bash warrior du tout.

J'aurai bêtement écris ça comme ça:
cp `find ~/Documents -maxdepth 1 -type f -name '*.pdf'` ~/Desktop/PDF

Edit: Je viens de lire le forum, et en fait il est dit que ce serait plus simple, ma question est donc en quoi est-ce plus simple ?Plus rapide peut-être pour un gros batch ? Plus transparent pour un non-habitué du terminal peut-être ? Merci :)

Edit 2: En fait ça à aussi le mérite de nous avoir fait découvrir cette commande, en plus traditionnel find auquel tous le monde a pensé. Donc :+1: à macG

avatar hirtrey | 

@Rictusi
find .... -exec mv (ou cp) {} mon_rep \;

avatar C1rc3@0rc | 

Ta commande plante lorsque t'as un nom de fichier (ou dossier) avec des espaces ou des caracteres non "unix" (accents, espace, caracteres de controle BASH,...)

De plus tu as interet a ajouter -p au cp sur Mac et avec un find il faut aussi rajouter un -n pour eviter que les multiple fichiers avec le meme noms s'écrasent.

avatar BeePotato | 

@ Rictusi : « Quel est l'intérêt de passer par le finder dans ce cas ci ? Je me demande s'il y a un avantage, est-ce plus rapide ? Plus ouvert ? Plus simple selon vous ? Je suis curieux de savoir n'étant pas un bash warrior du tout. »

En plus du souci de mauvaise gestion des noms de fichiers qu’a déjà soulevé C1rc3@0rc, ta solution présente un autre problème : les fichiers PDF avec une extension en majuscules ne seront pas copiés. Et on peut généraliser ce problème au cas des formats de fichier pour lequels plusieurs extensions sont valides.

Le passage par Spotlight via mdfind permet d’éviter cet écueil, puisqu’on n’y spécifie que le type de fichier, laissant Spotlight se débrouiller avec les extensions (ou éventuels autres systèmes d’indication du type des fichiers).

De plus, l’utilisation de mdfind sera potentiellement plus rapide qu’un find, qui parcourt le contenu des dossiers et sous-dossiers pour faire sa recherche, alors que Spotlight se repose sur sa base de données.

avatar PiRMeZuR | 

Une action de dossier serait même encore plus pratique pour déplacer automatiquement tous les PDF déposés dans un dossier dans un autre.

avatar C1rc3@0rc | 

+1

Surtout qu'en Apple script il est facile d'excuter un commande Bash...

avatar stivjobs | 

Sinon pour réellement automatiser on doit pouvoir faire une petite tache CRON !

crontab -e
0 12 * * 1 votre-commande

Et ce sera exécuté sans rien avoir à faire tous les lundis à midi !

avatar docmib | 

Tout dépend des besoins et de l'utilisation de l'ordinateur. Un utilisateur va préférer la plateforme graphique du Finder, un admin va en général privilégier la ligne de commande, plus complexe au départ certes mais permettant des manipulation beaucoup plus précises.

Perso je créé des scripts régulièrement et en effet il me faut parfois plusieurs heures pour en développer un complet, tester dans différentes situations. Mais au final quand on voit le résultat et le temps de gagné pour des tâches récurrentes il n'y a pas photo !

Le dernier en date: récupération de données sur un disque dur qui peine à monter par example. Le script va copier tous les dossiers d'un utilisateurs donnée après donnée sur un disque fraichement installé. Ca m'a sauvé pas mal d'utilisateurs là ou certains logiciels plantaient me disant que le disque était trop lent et défectueux. Bon pour certains il aura fallu plusieurs jours et tout n'a pas été récupéré mais autrefois quand je faisait ca à la main et au début sans script ligne par ligne de terminal ca me mobilisait pas mal. A présent j'attend que le script me dise haut et fort qu'il a terminé, petit log de fichiers qu'il n'a pas pu récupérer, droits modifiés sur les fichiers qui ont tous été remis en place et tout ca en double-cliquand sur un fichier bash ".command"......

Alors oui un certains temps de "perdu" à développer mais à la longue il m'a fait gagner déjà plusieurs jours de taf que je peux mobiliser sur d'autres tâches.

Pour ceux et celles qui voudraient un exemple concret tout est dit ici: http://imgur.com/gallery/Q8kV8

avatar Ielvin | 

@docmib

Bonjour :)

Je copie les données à la main , comme vous avant ^^.
Je serai intéressé par un partage du script à titre personnel.

Apres si vous l'avez fait dans un cadre professionnel je peux comprendre que vous ne vouliez pas .

avatar docmib | 

@Ielvin

Bonjour,

En effet j'ai développé ca au sein de mon travail, mais si le coeur vous en dis je peux partager avec vous une partie du code si vous souhaitez le re-créer de votre côté.

Envoyez-moi un MP avec votre adresse email et on va voir ce qu'on peut faire ;)

avatar BeePotato | 

@ docmib : « Tout dépend des besoins et de l'utilisation de l’ordinateur. »

Oui, mais pas seulement. Ça dépend aussi des tâches à accomplir. Il convient de choisir le bon outil pour la bonne tâche.

« Un utilisateur va préférer la plateforme graphique du Finder, un admin va en général privilégier la ligne de commande, plus complexe au départ certes mais permettant des manipulation beaucoup plus précises. »

Un bon administrateur, comme un bon utilisateur d’ailleurs, privilégiera surtout l’outil le plus adapté pour accomplir ce qu’il veut.
Pour la plupart des manips complexes, ça passera par un script. Mais pour une manipulation aussi simple que ce qui est présenté dans l’article, Automator sera tout aussi adapté — voire plus, si le but n’est pas de déclencher l’action via cron mais manuellement, auquel cas une icône d’application dans le Dock ou dans la barre d’outils du Finder sera plus rapidement accessible qu’une commande dans le terminal. Et la vitesse de développement de la solution équivalente dans Automator est tout à fait équivalente à celle de l’écriture de la commande, avec le bonus d’un risque d’erreur nettement plus faible.

« Mais au final quand on voit le résultat et le temps de gagné pour des tâches récurrentes il n'y a pas photo ! »

Cet argument est en faveur de l’automatisation des tâches — pas spécifiquement en faveur d’une méthode d’automatisation ou d’une autre.

avatar docmib | 

@BeePotato

J'abonde entièrement ! Il faut toujours privilégier l'outil qui convient le mieux.
Après j'ai aussi rencontré de bons utilisateurs comme de bons administrateurs qui utilisaient des usines à gaz pour de toutes petites tâches (j'ai fait partie de ces personnes et j'en ferai partie toute ma vie y'a pas de miracle ! Il y aura toujours de nouveaux outils meilleurs que les précédents).

avatar BeePotato | 

@ docmib : « Après j'ai aussi rencontré de bons utilisateurs comme de bons administrateurs qui utilisaient des usines à gaz pour de toutes petites tâches »

Il peut y avoir une raison toute simple à ça : dans bien des cas, l’outil qui convient le mieux est celui qu’on maîtrise le plus, histoire de développer rapidement une solution à un petit problème tout bête, sans avoir à prendre le temps d’apprendre un nouvel outil.
Et parfois, ça se traduit par un développement finalement pas rapide du tout et aboutissant à un truc monstrueux par rapport au problème traité ou à ce qu’on aurait pu obtenir via une autre approche. :-)

avatar Ielvin | 

" D’autres paramètres sont aussi disponibles, comme la date "

Ça veut dit que l'on peut choisir de sélectionner uniquement un type de fichier , de les classer par date de création (sur l'ordi). Et de les copier (une fois -n) dans un dossier de sortie ?

Oú comment récupérer toutes ses photos et les classer par date. ?

avatar hirtrey | 

@Ielvin

Avec un script tu peux tous faire.

avatar ovea | 

Le problème avec le terminal, c'est qu'il n'est pas disponible sur iOS

Faire un script pour l'interface graphique sur mOS révèle une difficulté supplémentaire quand on sait que bien trop d'objets de l'interface ne sont pas directement accessibles à l'interaction et que ce script ne peut être exécuté en arrière plan sinon en dupliquant l'utilisateur et en lançant une connexion VNC ARD … autant comparer avec le couple terminal/X11

avatar marc_os | 

C'est quoi « tous les PDF des Documents » ?

avatar BeePotato | 

@ marc_os : « C'est quoi « tous les PDF des Documents » ? »

Tous les fichiers PDF dans le dossier Documents et ses sous-dossiers (comme le confirment la capture d’écran et la requête mdfind).

avatar ovea | 

L'automatisation chez Apple n'existe pas depuis le maître d'œuvre : l'utilisateur !!!!

CONNEXION UTILISATEUR