Je veux que shotwell ouvre tous les fichiers .cr2 dans un dossier et tous ses sous-dossiers, quelle ligne de commande dois-je utiliser?

9

Quelque chose comme

shotwell *.cr2 ./

Cela ne fonctionne pas, mais en gros, je veux utiliser shotwell pour ouvrir tous les fichiers se terminant par .cr2et dans le répertoire actuel (y compris les sous-dossiers)

Le contexte est qu'il me manque des photos que j'ai prises sur mon appareil photo que j'ai depuis supprimées de ma carte mémoire.

Il y a des miniatures pour eux dans les "images manquantes" de Shotwell mais je ne les trouve pas. Alors j'ai pensé que je courrais photorecpour essayer de les trouver. En conséquence, photorec m'a donné un tas de dossiers et de fichiers, suffisamment pour qu'il remplisse mon disque dur. Au lieu de passer au crible tous les fichiers un par un, j'ai décidé de rechercher des fichiers .cr2 sur mon disque dur, tout en évitant un dossier particulier appelé Photogsque je sais ne pas en avoir car ils ne faisaient pas partie du photorecvidage de données.

user285884
la source
@EliahKagan voir les commentaires (qui ont continué dans le chat!) Pour plus de détails ici . Je ne sais pas si et comment éditer la question, alors veuillez conseiller, étant donné que vous avez créé une si belle réponse
Zanna
@ user285884 Les modifications les plus récentes apportées à ma réponse incluent une procédure détaillée pour créer une arborescence de liens symboliques vers des fichiers .cr2 uniquement, qui peuvent ensuite être ouverts dans Shotwell (et d'autres méthodes). Cela devrait résoudre le problème de voir des fichiers supplémentaires, non .cr2 dans Shotwell ainsi que le problème de ne pas avoir suffisamment d'espace sur le périphérique de destination pour déplacer ou copier les fichiers. Je ne savais pas, d'après le chat pertinent , si vous aviez résolu cela encore.
Eliah Kagan

Réponses:

6

Habituellement, vous voudrez simplement ouvrir Shotwell et faire glisser le dossier.

Si vous en avez besoin, vous pouvez demander au shell de créer une liste de fichiers CR2 et demander à Shotwell de n'ouvrir que ces fichiers. Parfois, c'est peut-être ce que vous voulez, mais dans ce cas, cela n'a pas fait exactement ce dont vous aviez besoin en raison du comportement de Shotwell - dans certaines autres circonstances, une fonctionnalité - de vous montrer automatiquement d'autres fichiers d'image (de tous types) résidant dans le mêmes dossiers que les images que vous avez ouvertes.

Pour vous assurer que Shotwell ne connaît que les images qui vous intéressent, vous pouvez cloner l'arborescence de répertoires ailleurs, en copiant uniquement les .cr2fichiers et les dossiers qui les contiennent, mais rien d'autre. Cela peut cependant occuper un espace supplémentaire substantiel. Une autre approche consiste donc à construire une hiérarchie de liens symboliques - où au lieu d'avoir une nouvelle arborescence de répertoires de copies de vos .cr2fichiers d' origine , vous disposez d'une nouvelle arborescence de répertoires de liens symboliques . Cela prend beaucoup moins de place.

Cette réponse couvre toutes ces approches.

Ouverture d'un dossier d'images (y compris les sous-dossiers) dans Shotwell

Shotwell lui-même vous donne deux façons d'ouvrir toute une arborescence de répertoires de photos. Si cela fonctionne pour vous, vous n'aurez pas besoin de faire quoi que ce soit d'intelligent dans la ligne de commande ou même de l'utiliser du tout. Sinon, vous pourriez finir par le faire en relation avec une autre technique. (Par exemple, si vous finissez par créer un nouveau répertoire de liens symboliques ou des copies de vos .cr2fichiers, vous pouvez utiliser l'une de ces façons pour l'ouvrir.)

Méthode 1: Ouvrez simplement le dossier entier dans Shotwell.

Dans Shotwell, dans le menu Fichier , cliquez sur Importer à partir du dossier . Sélectionnez ensuite le dossier dans lequel vous souhaitez importer des images. Cela ne se limitera pas aux .cr2fichiers, mais si vous ouvrez des fichiers à partir de plusieurs sous-dossiers contenant des .cr2images créées à partir d'un appareil photo numérique, ce seront probablement les seuls fichiers présents.

Capture d'écran de l'élément de menu Importer à partir du dossier dans le menu Fichier de Shotwell.

Voir la réponse de Jakob à Afficher toutes les images de manière récursive (inclure tous les sous-dossiers) pour plus d'informations.

Méthode 2: faites glisser le dossier dans Shotwell.

Avec la plupart des environnements de bureau et des navigateurs de fichiers, vous pouvez également ouvrir Shotwell et faire glisser le dossier contenant vos images dans la fenêtre Shotwell. Comme Importer à partir d'un dossier , c'est une autre façon que Shotwell recommande d'ouvrir des photos.

Capture d'écran de moi faisant glisser mon dossier Desktop dans Shotwell pour importer les images qu'il contient.

Lorsque vous faites glisser depuis une fenêtre de navigateur de fichiers ou votre bureau vers Shotwell, vous pouvez faire glisser vers une bibliothèque spécifique. Ou si vous n'avez pas plusieurs bibliothèques configurées, vous pouvez simplement faire glisser n'importe où et cela fonctionne. (Vous n'avez même pas besoin de faire glisser dans le volet gauche.)

Cette méthode est très pratique et elle est aussi puissante que la sélection manuelle du dossier (avec Fichier > Importer à partir du dossier , comme décrit ci-dessus). Lorsque vous ouvrez des fichiers ou des dossiers à l'aide de l' une de ces méthodes , Shotwell vous donne la possibilité d'ouvrir les photos sans les copier dans sa bibliothèque.

Capture d'écran de la boîte de dialogue de Shotwell qui demande à l'utilisateur de choisir entre copier des images vers l'emplacement de leur bibliothèque Shotwell, ou les importer sur place, sans aucune copie.

Pour importer sans copier, cliquez sur Importer sur place au lieu de Copier des photos .


Lancement de Shotwell avec une liste de noms de fichiers d'images

Si, pour une raison quelconque, vous voulez ou devez le faire en exécutant une commande dans le terminal, vous pouvez exécuter la shotwellcommande et lui passer le nom de fichier de chaque image comme argument. Globstar vous facilite la tâche:

shopt -s globstar
shotwell **/*.cr2

Cela ouvre les .cr2fichiers situés n'importe où dans le répertoire actuel. Il diffère de l'exécution de Shotwell puis du déplacement du dossier dans la mesure où Shotwell essaiera uniquement d'importer les fichiers dont vous lui donnez le nom. Cependant, étant donné que Shotwell affiche souvent d'autres fichiers image provenant des mêmes dossiers que les fichiers que vous lui avez demandé d'ouvrir, cela peut ne pas convenir à vos besoins. (Et de plus amples informations que vous avez données sur votre problème suggèrent qu'il ne l'est pas . Voir ci-dessous pour une alternative.)

Cela n'inclut pas les fichiers ou sous-dossiers dont les noms commencent par. . Cependant, si vous avez des fichiers CR2 dont les noms commencent par un point, la plupart du temps, vous ne voudrez probablement pas les ouvrir dans Shotwell de toute façon. Sauf si vous avez délibérément nommé vos fichiers ou dossiers de cette manière, un fichier dot avec une extension de nom de fichier d'image ou de document est plus susceptible d'être un fichier de métadonnées plutôt qu'une image ou un document réel. Par exemple, macOS ajoute souvent de tels fichiers (par exemple, ._kittens.cr2pour une image réelle kittens.cr2) lors de l'accès à des supports externes (y compris des lecteurs flash et des appareils photo numériques).

Si vous souhaitez également rechercher des fichiers dont les noms commencent par .ou qui se trouvent dans des dossiers dont les noms commencent par. , activez également dotglob. Vous pouvez le faire avec shopt -s dotglobou en passant les deux globstaret dotglobau shoptbuiltin:

shopt -s globstar dotglob

Par défaut, les globes sont sensibles à la casse. Mais vous pouvez faire correspondre les noms de fichiers insensibles à la casse , de manière à ouvrir les fichiers se terminant par .cr2, .Cr2, .cR2et .CR2. Pour ce faire, soit:

  • Activez nocaseglob en exécutant shopt -savec nocaseglob, seul ou avec d'autres options de shell. Par exemple, pour exécuter shotwellsur tous les .cr2fichiers, en recherchant de manière insensible à la casse et en incluant les .fichiers et les fichiers dans les .répertoires:

    shopt -s globstar dotglob nocaseglob
    shotwell **/*.cr2
    
  • Ou utilisez-le .[cC][rR]2au lieu de .cr2dans votre modèle de glob lui-même. Par exemple, cela accomplit la même chose que ci-dessus:

    shopt -s globstar dotglob
    shotwell **/*.[cC][rR]2
    

    Notez que la sensibilité à la casse est entièrement distincte de la correspondance ou non des .fichiers et des dossiers. Vous pouvez supprimer dotglobdes exemples ci-dessus et ils peuvent toujours être insensibles à la casse.

Pour spécifier un répertoire plutôt que de simplement utiliser le répertoire courant, mettez son nom et un /avant le **/*.cr2glob. Par exemple, remplacer la shotwellcommande ci-dessus par celle-ci ouvrira tous les .cr2fichiers du Picturessous - répertoire de votre répertoire personnel:

shotwell ~/Pictures/**/*.cr2

Contrairement à la première commande qui utilise votre répertoire actuel, peu importe où vous exécutez cette commande, vous direz à Shotwell d'ouvrir les mêmes fichiers.

Essai

Si vous devez vraiment utiliser le terminal pour cela, alors je suppose que cela peut faire partie de quelque chose de plus complexe. Si vous le souhaitez, vous pouvez tester ces commandes avant de les exécuter en les remplaçant shotwellpar printf '%s\n'. Au lieu de transmettre les noms de fichiers à Shotwell, cela les répertorie un par ligne. Par exemple, sur ma machine:

ek@Io:~$ printf '%s\n' ~/tmp/**/*.cr2
/home/ek/tmp/another image.cr2
/home/ek/tmp/image.cr2
/home/ek/tmp/some folder/image3.cr2

Désactivation de Globstar et d'autres options de shell

L'option shell globstar a été activée pour fonctionner, ce que la shopt -s globstarcommande (ci-dessus) a fait. S'il est déjà activé, vous n'avez pas besoin de plusieurs commandes. Et vous n'avez besoin de définir globstar qu'une seule fois par instance de shell.

Vous pouvez désactiver globstar en exécutant:

shopt -u globstar

Et vous pouvez vérifier si globstar est activé ou désactivé en exécutant:

shopt globstar

Si vous utilisez globstar dans un script, vous devriez envisager de le désactiver s'il peut y avoir du code qui vient ensuite dans le même script qui n'est pas écrit en pensant à globstar. Par exemple, écrire **quand vous voulez dire *n'est généralement pas un problème lorsque globstar est désactivé, mais avec globstar activé, cela peut provoquer de graves problèmes en faisant en sorte qu'une commande affecte bien plus de fichiers que ce que quelqu'un avait prévu.

De même, si vous avez utilisé dotglob ou nocaseglob et que vous souhaitez également les désactiver, vous pouvez le faire avec shopt -u dotglobet shopt -u nocaseglob, respectivement. Vous pouvez également passer plusieurs options de shell à shopt -upour les désactiver en même temps. Par exemple, pour désactiver globstar, dotglobet nocaseglob:

shopt -u globstar dotglob nocaseglob

Par rapport à globstar, il y a moins d'erreurs graves que vous pourriez faire parce que vous avez oublié que vous avez laissé dotglob ou nocaseglob. Mais d'autres personnes (y compris les personnes que vous consultez sur des sites comme Ask Ubuntu) supposent généralement que dotglob et nocaseglob sont désactivés lorsqu'ils vous suggèrent des commandes à utiliser, sauf si vous leur dites le contraire.

Pour plus d'informations sur ces options de shell liées aux globes (et également sur les globes en général ), consultez le manuel de référence bash . Ils sont tous couverts principalement dans 4.3.2 The Shopt Builtin . Pour globstar, voir aussi 3.5.8.1 Match Matching . Pour dotglob, voir aussi 3.5.8 Extension du nom de fichier .


Création d'une nouvelle arborescence de répertoires

Étant donné que dans votre cas, vous semblez vraiment avoir besoin de Shotwell pour n'afficher que les .cr2 fichiers, vous avez des non- .cr2fichiers dans les mêmes dossiers que les .cr2fichiers, et la navigation dans Shotwell propose automatiquement ces fichiers aussi , il semble que vous aurez besoin d'avoir un dossier qui ne contient aucun autre fichier image que les .cr2fichiers que vous essayez d'ouvrir.

Le déplacement des fichiers, comme vous l'avez suggéré , est une approche, mais je recommande plutôt de copier les fichiers ou, mieux, de créer des liens symboliques vers les fichiers (voir également FOLDOC ), car:

  • Si vous déplacez les fichiers sur plusieurs appareils, cela nécessite de toute façon une copie, donc dans ce cas, le déplacement n'est pas plus rapide.
  • Si vous avez de l'espace, c'est souvent une bonne idée de conserver un dossier non modifié de tout ce que vous avez commencé jusqu'à ce que vous soyez convaincu que ce que vous avez fait est correct selon vos besoins. De toute évidence, ce n'est pas toujours applicable ou pratique. Mais dans votre cas, ces fichiers sont le résultat d'une opération de récupération de données. Il peut être utile de conserver un enregistrement facile à parcourir de ce qui a été récupéré et d'où.
  • Si vous choisissez de créer des liens symboliques, la quantité d'espace supplémentaire consommée est extrêmement faible . (Si le disque cible est complètement plein , cependant, vous devrez toujours libérer de l'espace sur celui-ci - ou utiliser un autre disque cible - pour créer des liens symboliques.)

Vous devez également prendre une autre décision. Créez-vous toutes les nouvelles entrées (qu'il s'agisse de copies ou de liens symboliques) dans le même répertoire, aplatissant la hiérarchie des fichiers? Ou créez-vous des répertoires à la destination correspondant à chacun des répertoires à la source qui contiennent au moins un .cr2fichier?

  • L'aplatissement de la hiérarchie des fichiers vous permet de voir tous les fichiers à la fois, facilement. En particulier, il est facile de voir les noms et tailles des fichiers en même temps, ainsi que de sélectionner n'importe quelle combinaison de fichiers dans un navigateur de fichiers graphique.

  • Mais il perd également des informations sur les dossiers dans lesquels ils se trouvaient, ce qui peut être utile (bien que vous puissiez retourner dans le dossier d'origine et les rechercher si vous ne déplacez pas les fichiers).

  • Le plus gros problème avec l'aplatissement de la hiérarchie des fichiers, cependant, est ce qui se passe si vous avez deux fichiers ou plus du même nom à différents endroits . Si vous aplatissez la hiérarchie des fichiers, selon la façon dont vous le faites, soit tous, sauf le premier, ne seront pas copiés (ou liés) et vous obtiendrez une erreur ou un avertissement, ou tous sauf la dernière copie (ou lien) être écrasé .

    C'est une autre raison pour laquelle je recommande de copier ou de créer des liens symboliques plutôt que de déplacer des fichiers. Si vous "réussissez" à déplacer plusieurs fichiers dans le même fichier, vous avez perdu tout sauf le dernier!

En raison des inconvénients de tout aplatir dans un seul répertoire sans sous-répertoires, les approches que je prends ici créent une nouvelle arborescence de répertoires à la destination.

Méthode 1: copie

Je montre cela d'abord parce que c'est un peu plus simple, mais je vous suggère plutôt de créer des liens symboliques ("Way 2"), surtout si le lecteur de destination peut ne pas avoir assez d'espace pour contenir tous les fichiers. "Way 2", qui est un peu plus compliqué, est beaucoup plus détaillé car il semble y avoir moins de ressources sur la façon d'utiliser cette technique, c'est la façon dont je m'attends à ce que la plupart des gens dans cette situation préfèrent, et des informations qui s'appliquent aux deux méthodes - des conseils de base pour échapper aux espaces dans les chemins - sont donnés ici plutôt qu'ici.

Lorsque vous devez copier une arborescence de répertoires et que vous devez personnaliser l'opération de copie, vous devez généralement utiliser à la rsyncplace de cp. C'est l'un de ces cas.

En remplaçant srcpar le chemin d'accès au répertoire de niveau supérieur contenant tous vos fichiers CR2 et en remplaçant destpar le nom du répertoire que vous souhaitez créer qui contiendra une hiérarchie de liens symboliques vers les fichiers CR2, exécutez:

rsync -rl --prune-empty-dirs --include='*/' --include='*.cr2' --exclude='*' src/ dest

N'oubliez pas /le nom après le nom du répertoire source, sauf si vous voulez qu'un répertoire de niveau supérieur supplémentaire soit créé à l'intérieurdest . Autrement dit, si vous omettez la fin /, puis rsyncfera le répertoire de destination pour vous, à l'intérieur dest. Par exemple, supposons srcest un chemin relatif contenant no /. Alors:

  • Avec src/dans votre rsynccommande, vous obtenez un lien symbolique dest/foo/bar.cr2pour le fichier src/foo/bar.cr2.
  • Avec srcdans votre rsynccommande, vous obtenez un lien symbolique pour le fichier .dest/src/foo/bar.cr2src/foo/bar.cr2

Comme il pourrait être déroutant pour le répertoire de niveau supérieur où les liens symboliques seront placés d'avoir le même nom que celui du répertoire de niveau supérieur contenant les .cr2fichiers vers lesquels les liens symboliques pointeront, je vous recommande d'inclure le /à la fin de la destination nom du répertoire dans votre rsynccommande. (Et, pour le répertoire source, donnez-lui un répertoire vide, qui n'existe pas ou qui est autrement dédié à cet effet. Sinon, vous encombrerez un autre dossier.)

Comme cela est généralement le cas lorsque vous passez le nom d'un fichier ou un répertoire à un programme de ligne de commande ou d'un script, si vos chemins de répertoire de destination ou de source contiennent des espaces vides (ou des caractères traités spécialement par la coquille, comme \, $, 'et divers autre ponctuation), alors vous devrez les citer . J'ai détaillé comment procéder, pour le cas le plus courant des espaces, dans "Way 2" - les conseils sur la citation dans cette section s'appliquent également ici. Cependant, si vous ne savez pas comment citer le nom d'un dossier, vous pouvez demander à Ubuntu de le faire pour vous en faisant simplement glisser le dossier dans le Temrminal; son chemin complet sera collé avec une citation correcte .

Après avoir copié uniquement les .cr2fichiers et les dossiers qui les contiennent, vous pouvez ouvrir le dossier de destination dans Shotwell. (Voir «Ouverture d'un dossier d'images (y compris les sous-dossiers) dans Shotwell» ci-dessus.) Cependant, avant de rsynccommencer, je vous recommande de décider si vous souhaitez ignorer les entrées commençant par .et si vous souhaitez inclure les entrées avec des suffixes variant pour la casse. Si c'est le cas, vous devrez exécuter une rsynccommande légèrement différente .

Personnalisation du traitement des entrées en pointillés et de la sensibilité à la casse

Vous souhaiterez peut-être utiliser une rsynccommande différente pour modifier si les fichiers et répertoires commençant par un point sont ignorés et si vous souhaitez ou non respecter la casse pour faire correspondre le suffixe .cr2.

La commande ci - dessus inclut des répertoires et des fichiers dont les noms commencent par .. Pour exclure de tels fichiers et répertoires, mettez --exclude='.*/' --exclude='.*'avant tous les autres --includes et --excludes. Autrement dit, utilisez rsyncplutôt cette commande (avec les substitutions appropriées pour srcet dest, bien sûr):

rsync -rl --prune-empty-dirs --exclude='.*/' --exclude='.*' --include='*/' --include='*.cr2' --exclude='*' src/ dest

Les rsynccommandes indiquées jusqu'ici ont été sensibles à la casse et ne seront pas copier des fichiers cette fin .CR2, .Cr2ou .cR2plutôt que .cr2. Si vous souhaitez que ces fichiers soient copiés, vous devrez en tenir compte en utilisant le --includemodèle *.[cC][rR]2à la place de *.cr2.

Cette troisième commande ne respecte pas la casse et (comme la première commande) ne saute pas les fichiers et répertoires dont les noms commencent par .:

rsync -rl --prune-empty-dirs --include='*/' --include='*.[cC][rR]2' --exclude='*' src/ dest

Si vous adoptez l'approche de la copie de fichiers avec rsync, et vous ne savez pas avec laquelle de ces commandes vous voulez, je suggère d'utiliser celle-ci si vous voulez vous assurer de ne rien manquer. Cependant, vous devez savoir que les fichiers dot peuvent contenir des métadonnées et que les fichiers dot nommés comme des images peuvent ne pas être vraiment des images. Voir les discussions sur les fichiers dot dans la section "Lancement de Shotwell avec une liste de noms de fichiers image" ci-dessus, et sur les fichiers dot et la sensibilité à la casse dans "Way 2" ci-dessous.

Cette quatrième commande ne respecte pas la casse et (comme la deuxième commande) ignore les fichiers et répertoires dont les noms commencent par :.

rsync -rl --prune-empty-dirs --exclude='.*/' --exclude='.*' --include='*/' --include='*.[cC][rR]2' --exclude='*' src/ dest

Méthode 2: création de liens symboliques

C'est ce que je vous recommande de faire, bien que la voie 1 soit correcte si vous avez suffisamment d'espace sur le lecteur de destination. Vous n'avez pas besoin de lire la voie 1 pour l'utiliser.

La méthode présentée ici fait une liste de .cr2fichiers et fait une boucle dans la liste, créant des répertoires cibles selon les besoins et les remplissant avec des liens symboliques vers chaque .cr2fichier.

C'est juste assez compliqué pour que je suggère de le mettre dans un script plutôt que de le taper de manière interactive. Vous pouvez placer le script où vous le souhaitez, mais pour plus de commodité, je vais vous montrer comment le faire avec le script placé directement dans votre dossier de départ.

Écrivez (ou collez) le script.

Créez un fichier texte,, make-symlinksdans votre dossier de départ. Aucune extension de fichier n'est nécessaire.

Vous pouvez le faire avec n'importe quel éditeur de texte, comme Vim, Nano, Gedit ou Leafpad. Cependant, n'utilisez pas de traitement de texte comme LibreOffice Writer. (Vous pouvez même le faire en exécutant cat > ~/make-symlinks, en collant le contenu du fichier et en appuyant sur Ctrl+ Dsur une nouvelle ligne, si vous le souhaitez.)

Si vous nommez le script autrement que make-symlinks, assurez-vous d'utiliser ce nom lorsque vous exécutez des commandes qui utilisent le script ultérieurement.

#!/bin/bash

shopt -s globstar dotglob nocaseglob

for f in **/*.cr2; do
    mkdir -p "$1/$(dirname "$f")"
    ln -s "$PWD/$f" "$1/$f"
done

Mettez-le dans le fichier et enregistrez le fichier. Ce script utilise globstar, une fonction Bash expliquée ci-dessus dans "Lancement de Shotwell avec une liste de noms de fichiers d'images" .

Vous pouvez modifier la façon dont il gère les entrées en pointillés et la sensibilité à la casse.

Selon vos besoins, vous souhaiterez peut-être apporter des modifications:

  • Si vous ne souhaitez pas inclure les .cr2fichiers dont les noms commencent par .ou qui résident dans des répertoires dont les noms commencent par ., supprimez dotglobde la shoptligne.

    Les fichiers et répertoires dont le nom commence par .sont souvent utilisés pour les métadonnées (voir la section «Lancement de Shotwell avec une liste de noms de fichiers d'images» ci-dessus). D'un autre côté, si vous voulez vous assurer que vous avez tout, ou s'il y a quelque chose inexplicablement manquant dont vous êtes presque sûr, alors vous devriez le garder dotglob.

  • Si vous souhaitez inclure uniquement les fichiers se terminant exactement .cr2mais pas des variantes de cas ( .CR2, .Cr2et .cR2), alors vous devez supprimer nocaseglob. Étant donné que votre situation implique la récupération de données et Shotwell ne vous montrera aucun des fichiers que vous avez manqués lorsque vous ouvrez le répertoire des liens symboliques - c'est le but de cette méthode, après tout - vous voudrez probablement le conserver nocaseglob.

Rendez-le exécutable.

Exécutez cette commande pour marquer l'exécutable de votre script:

chmod +x ~/make-symlinks

Exécutez-le à la source et passez la destination comme argument.

Ensuite, changez de répertoire pour le répertoire source, c'est-à-dire le dossier de niveau supérieur qui contient les images. Par exemple, s'ils se trouvent dans le Picturessous - répertoire de votre répertoire personnel, vous exécuterez:

cd ~/Pictures

C'est là que vous exécuterez le script. Passez le répertoire de destination au script comme argument de ligne de commande.

Par exemple, si vous souhaitez qu'un répertoire appelé cr2ssoit créé sur votre bureau pour contenir les liens symboliques, exécutez:

~/make-symlinks ~/Desktop/cr2s

Ou si vous voulez juste ce répertoire directement dans votre dossier personnel:

~/make-symlinks ~/cr2s

Ou si vous avez un lecteur monté sur /media/you/MyDriveet que vous souhaitez créer un dossier appelé linkspour contenir les liens symboliques:

~/make-symlinks /media/you/MyDrive/links

Mais si le lecteur est /media/you/My Drive(avec un espace), vous devez utiliser la citation. N'importe lequel de ces travaux (utilisez un seul, ne les exécutez pas tous):

~/make-symlinks '/media/you/My Drive/links'
~/make-symlinks /media/you/'My Drive'/links
~/make-symlinks /media/you/My\ Drive/links

Mais si vous utilisez ~pour votre répertoire personnel, ne citez pas cela:

~/make-symlinks ~/'Two Words'   # good
~/make-symlinks ~/Two\ Words    # good
~/make-symlinks '~/Two Words'   # BAD, because ~ doesn't get expanded

make-symlinkscrée le répertoire de destination pour vous s'il n'existe pas déjà, tout comme il crée des sous-répertoires en son sein. Cependant, cela fonctionne toujours si la destination existe déjà.

Vous pouvez même l'exécuter plusieurs fois et passer le même répertoire de destination (par exemple, si vous l'avez interrompu avec Ctrl+ C), mais vous obtiendrez des failed to create symbolic linkerreurs pour les liens symboliques qui existent déjà, et cela pourrait être déroutant.

Vous ne voulez probablement pas transmettre le nom d'un répertoire qui existe déjà et contient des fichiers non liés (comme votre répertoire personnel) make-symlinks. Si vous le faites, vous pouvez vous attendre à ce qu'un tas de liens symboliques et de sous-dossiers y soient créés. Vous voudrez probablement utiliser un nouveau répertoire - ou qui n'existe pas encore - pour make-symlinks.

Importez l'arborescence des liens symboliques nouvellement créée dans Shotwell.

Après avoir exécuté make-symlinks, importez simplement le répertoire que vous lui avez transmis dans Shotwell, en utilisant l'une des méthodes indiquées dans la première partie de cette réponse ( "Ouverture d'un dossier d'images (y compris les sous-dossiers) dans Shotwell" ). Par exemple, vous pouvez ouvrir Shotwell et faire glisser le dossier.

Étant donné que toutes les entrées du dossier sont des liens symboliques vers des .cr2fichiers ou des répertoires qui les contiennent, sans aucun autre type de fichier, Shotwell ne devrait voir aucun des autres fichiers.

Eliah Kagan
la source
5

Shotwell parcourra toutes les images trouvées dans chaque répertoire où une image est ouverte, donc en utilisant find -name '*.cr2' -exec shotwell '{}' + comme je l'ai suggéré initialement n'aide pas vraiment. Étant donné que les paramètres de Shotwell sont plutôt limités, la seule façon dont je peux penser à n'ouvrir que les fichiers que vous souhaitez est de déplacer les fichiers vers un nouveau répertoire par eux-mêmes.

Vous pouvez utiliser findpour cela:

mkdir ~/cr2files
find -type f -iname '*.cr2' -not -path './dir/*' -exec cp -v -- '{}' ~/cr2files \;

Remplacez cppar mvsi vous souhaitez éviter de créer des fichiers en double.

Remarques:

  • mkdir ~/cr2files créer un nouveau répertoire dans votre répertoire personnel
  • find recherche récursivement du répertoire courant vers le bas à travers l'arborescence
  • -type f rechercher uniquement les fichiers
  • -iname rechercher des fichiers par nom, en ignorant la casse
  • '*.cr2'noms se terminant par .cr2- utilisez des guillemets pour empêcher le shell d'étendre le glob avant qu'il ne soit transmis àfind
  • -not -path './dir/*'exclura le contenu du répertoire dirdes résultats
  • {} représente les chemins des fichiers trouvés
  • --après cpest de dire de cpne pas accepter d'autres options, ce qui évite tout nom de fichier commençant par -causer des problèmes

Vous pouvez ensuite ouvrir n'importe quel fichier dans le nouveau répertoire avec Shotwell et les parcourir tous

Zanna
la source
pourquoi cela ouvre-t-il également les fichiers .jpg et .png dans le répertoire? Je vois qu'il spécifie * .cr2? Comment puis-je obtenir qu'il regarde simplement les fichiers .cr2 lorsque j'appuie sur la flèche gauche de Shotwell? Si j'utilise un \ au lieu d'un +, rien ne se passe :(
user285884
Oh! c'est un problème @ user285884 Je suis désolé, Shotwell parcourt toutes les images qu'il trouve dans le répertoire ... laissez-moi voir si je peux trouver un moyen de le contourner ...
Zanna
@ user285884 modifié, mais je ne peux pas trouver de solution élégante :(
Zanna
1
ok, merci pour l'effort! qu'en est-il, je recherche dans le répertoire des fichiers .cr2 et les déplace dans un dossier séparé appelé cr2files. Je l'ai fait dans un sous-dossier en utilisant mv * .cr2 ../cr2files/ et cela a fonctionné !. Cependant, comment dois-je procéder et spécifier les fichiers à examiner? Quelque chose comme "hey linux regardez les dossiers 1-10 pour les fichiers .cr2 et déplacez-le dans le dossier cr2files"? Merci Zanna
user285884
1
bien pour un certain contexte sur où je suis. J'ai perdu quelques photos. J'ai donc fait un photorec et cela m'a donné une cargaison de dossiers, assez pour remplir tout mon disque dur. Je veux donc regarder dans tous les dossiers de mon disque dur, sauf un, car celui-ci contient une tonne de fichiers .cr2 que je sais ne pas être celui que je recherche. Je veux donc que Linux passe en revue tous les dossiers sauf un. Je ne suis pas sûr que votre code le fasse. Que fait {}? Aussi le "-" après le -v? Merci Zanna!
user285884
1

Option 1 - Utilisation xargslorsque les noms de fichiers contiennent des espaces

Comme l'ont souligné les commentaires ci-dessous, l'utilisation de back ticks(Option 3 ci-dessous) sera interrompue lorsque les noms de fichiers contiennent des espaces. La méthode la plus sûre d'utiliser la findcommande et de passer la sortie à l' shotwellutilisation de l' xargsoption ressemble à ceci:

find . -name "*.cr2" -print0 | xargs -0 shotwell

L' -print0indicateur indique à find d'utiliser des \0délimiteurs (caractère nul) entre les noms de fichiers, et l' -0indicateur indique xargsà attendre ces \0délimiteurs.

Nous remercions les excellentes réponses trouvées ici ( comment diriger la liste des fichiers retournés par la commande find ) sur Stack Overflow.

Option 2 - Utilisation -execlorsque les noms de fichiers contiennent des espaces

Comme le remarque ci-dessous, l' -execoption prend également en charge les noms de fichiers contenant des espaces. Les autres commentaires ci-dessous indiquent que cela se casse lorsque le nombre de fichiers dépasse. Cela ressemblerait à ceci:

find . -name "*.cr2" -exec shotwell {} +

Option 3 - Lorsque les noms de fichiers n'ont pas d'espaces

Dans les temps anciens, avant que les noms de fichiers aient des espaces et deviennent longs de 256 caractères, cette option fonctionnait bien. Vous trouverez cette option mentionnée sur de nombreux autres sites Web, mais vous ne devez pas utiliser cette option . À l'époque, utiliser la findcommande et transmettre la sortie à shotwellétait la méthode la plus simple:

shotwell `find . -name "*.cr2"`

Cela démarre à findpartir du répertoire actuel et inclut tous les sous-répertoires:

  • Notez l'utilisation back ticket non les guillemets simples 'ci-dessus. L'utilisation de back-ticks est similaire à la mise en boîte de phrase $(...)dans bash.
  • Le premier argument .donne findun point de départ qui est le répertoire courant. Vous pouvez passer /home/$USER/Picturesou autre chose au lieu de ..
  • Le deuxième argument -nameindique à find de rechercher les noms de fichiers (pas les répertoires).
  • Cette technique fonctionne pour toutes les commandes, pas seulement shotwell. dire que vous pouvez l' utiliser pour cat, head, tailet la plupart des autres commandes Linux populaires.
WinEunuuchs2Unix
la source
L'utilisation des backticks est en quelque sorte désapprouvée, de plus, elle a des problèmes avec le fractionnement des mots. Je vous recommande de le changer en pipe avec xargs et d'utiliser -0tous les noms de fichiers utilisez une chaîne NULL comme séparateur
Sergiy Kolodyazhnyy
Le problème avec l'approche de cette réponse est qu'elle fait la mauvaise chose lorsque l'un des noms de fichiers ou les noms de répertoires contenant les fichiers ont des espaces. Notez que, bien que beaucoup de gens préfèrent la $( )syntaxe de substitution de commandes à la syntaxe de substitution de commandes de backtick, ce n'est pas pertinent pour ce problème - ils échouent tous les deux exactement de la même manière. @Serg Je suggère de poster une nouvelle réponse sur la façon de le faire xargs. (La substitution " "ne fonctionnerait pas non plus: tous lesfind résultats seraient transmis comme un seul argument.)
Eliah Kagan
J'ai vu aussi xargs option sur Stack Overflowlors de l'écriture de cette réponse. Je développerai également cette option. Malheureusement, j'ai dû démarrer avec Windows 8 ce matin pour corriger une NTFSpartition corrompue, donc les tests ont été problématiques. Je mettrai à jour la réponse plus tard. Merci de l'avoir signalé :)
WinEunuuchs2Unix
pourquoi ne pas simplement utiliser -exec ?
Zanna
@Zanna J'ajouterai aussi l' -execoption :)
WinEunuuchs2Unix
-2

Je ne savais pas que Shotwell avait même ouvert des fichiers bruts. Je suis certain que vous pourriez obtenir plus de kilométrage avec digikam ou darktable. Digikam est livré avec quelques composants Kde et est un très bon gestionnaire de photos. Darktable est livré avec de très bonnes capacités d'édition non destructives.

user114644
la source
Pouvez - vous cette réponse (par modifier ING) afin d' inclure des informations détaillées sur l'utilisation de Digikam (ou darktable) pour parcourir seulement les .cr2fichiers dans un dossier? Si c'est le cas, cela pourrait être utile, car l'affiche originale a eu du mal à faire en sorte que Shotwell ne montre que les .cr2fichiers. Bien que j'aie ajouté des approches supplémentaires à ma réponse pour permettre d'utiliser Shotwell pour parcourir uniquement ces fichiers et pas d'autres, je soupçonne assez fortement que Shotwell n'est pas le meilleur outil pour cela.
Eliah Kagan