web-dev-qa-db-fra.com

Je veux que Shotwell ouvre tous les fichiers .cr2 d'un dossier et tous ses sous-dossiers. Quelle ligne de commande dois-je utiliser?

Quelque chose comme

shotwell *.cr2 ./

Cela ne fonctionne pas, mais je souhaite utiliser Shotwell pour ouvrir tous les fichiers se terminant par .cr2 et dans le répertoire en cours (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.

Les images manquantes de Shotwell contiennent des vignettes, mais je ne les trouve pas. J'ai donc décidé de lancer photorec pour essayer de les trouver. En conséquence, photorec m'a fourni un grand nombre de dossiers et de fichiers, ce qui m'a permis de remplir mon disque dur. Au lieu de parcourir 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é Photogs que je ne connais pas, car ils ne faisaient pas partie de le photorec vidage de données.

9
user285884

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

Si vous en avez besoin, vous pouvez demander au shell de créer une liste de fichiers CR2 et d'indiquer à Shotwell d'ouvrir uniquement ces fichiers. Parfois, cela peut être ce que vous voulez, mais dans ce cas qui n'a pas fait tout ce dont vous aviez besoin en raison du comportement de Shotwell - dans certaines autres circonstances, une fonctionnalité - d'afficher automatiquement vous autres fichiers image (de tous types) résidant dans les 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 ne copiant que les fichiers .cr2 et les dossiers qui les contiennent, mais rien d’autre. Cela peut cependant prendre beaucoup de place. Une autre approche consiste donc à construire une hiérarchie de liens symboliques - où, au lieu d’avoir une nouvelle arborescence de répertoires decopies devos fichiers originaux .cr2 , vous avez une nouvelle arborescence de répertoiressyminks versthem. 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 une arborescence complète de photos. Si cela fonctionne pour vous, vous n'aurez à faire aucune action intelligente dans la ligne de commande, ni même à l'utiliser du tout. Sinon, vous pourriez le faire en liaison avec une autre technique. (Par exemple, si vous créez un nouveau répertoire de liens symboliques ou des copies de vos fichiers .cr2, vous pouvez l’ouvrir de l’une des façons suivantes.)

Méthode 1: Ouvrez tout le dossier dans Shotwell.

Dans Shotwell, dans le menuFichier, cliquez surImporter du dossier. Sélectionnez ensuite le dossier à partir duquel vous souhaitez importer des images. Cela ne sera pas limité aux fichiers .cr2, mais si vous ouvrez des fichiers à partir de plusieurs sous-dossiers contenant des images .cr2 créées à partir d'un appareil photo numérique, ceux-ci seront probablement les seuls fichiers présents.

Screenshot of the Import from Folder menu item in the File menu of Shotwell.

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

Voie 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. CommeImporter du dossier, c'est une autre façon que Shotwell recommande d'ouvrir les photos.

Screenshot of me dragging my Desktop folder into Shotwell to import the images it contains.

Lorsque vous faites glisser une fenêtre du navigateur de fichiers ou votre bureau vers Shotwell, vous pouvez faire glisser 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 tout fonctionne. (Vous n'avez même pas besoin de faire glisser dans le volet gauche.)

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

Screenshot of the dialog box in Shotwell that asks the user to choose between copying images to the location of their Shotwell library, or importing them in place, without any copying.

Pour importer sans copier, cliquez surImporter sur placeau lieu deCopier les photos.


Lancer Shotwell avec une liste de noms de fichiers images

Si, pour une raison quelconque, vous souhaitez ou devez effectuer cette opération en exécutant une commande dans le terminal, vous pouvez exécuter la commande shotwell et lui transmettre le nom de fichier de chaque image en tant qu'argument. Globstar facilite les choses:

shopt -s globstar
shotwell **/*.cr2

Cela ouvre les fichiers .cr2 situés n’importe où dans le répertoire en cours. Cela diffère de l'exécution de Shotwell et du déplacement du dossier, en ce sens que Shotwell essaiera uniquement d'importer les fichiers dont vous lui donnez le nom. Toutefois, comme Shotwell affiche souvent d’autres fichiers image provenant des mêmes dossiers que ceux que vous avez indiqués d’ouvrir, il se peut que cela ne corresponde pas à vos besoins. (Et Les informations supplémentaires que vous avez données sur votre problème suggèrent que ce n'est pas . Voir ci-dessous pour une alternative.)

Cela n'inclut pas les fichiers ni les sous-dossiers dont le nom commence par .. Cependant, si vous avez des fichiers CR2 dont les noms commencent par un point, alors la plupart du temps, vous voudrez probablementdon't/ vouloir les ouvrir dans Shotwell de toute façon. À moins que vous n'ayez délibérément nommé vos fichiers ou vos dossiers de cette manière, un fichier point doté d'une extension de nom de fichier d'image ou de document est plus susceptible d'être un fichier de métadonnées que d'être une image ou un document réel. Par exemple, macOS ajoute souvent de tels fichiers (par exemple, ._kittens.cr2 pour une image réelle kittens.cr2) lors de l'accès à un support externe (y compris des clés USB et des appareils photo numériques).

Si vous souhaitez rechercher également les fichiers dont le nom commence par . ou qui se trouvent dans des dossiers dont le nom commence par ., activez également dotglob. Vous pouvez le faire avec shopt -s dotglob ou en passant globstar et dotglob à la variable shopt:

shopt -s globstar dotglob

Par défaut, les globs sont sensibles à la casse. Mais vous voudrez peut-être faire correspondre les noms de fichiers sans tenir compte de la casse , de façon à ouvrir les fichiers se terminant par .cr2, .Cr2, .cR2 et .CR2. Pour ce faire, soit:

  • Activez nocaseglob en exécutant shopt -s avec nocaseglob, seul ou avec d'autres options de shell. Par exemple, pour exécuter shotwell sur tous les fichiers .cr2, effectuez une recherche sans tenir compte de la casse et incluez les fichiers .- et les fichiers dans les répertoires .-:

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

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

    Notez que la distinction entre majuscules et minuscules et les minuscules . correspond ou non à la casse. Vous pouvez supprimer dotglob des exemples ci-dessus et ils peuvent toujours être insensibles à la casse.

Pour spécifier un répertoire plutôt que d'utiliser simplement le répertoire actuel, placez son nom et un / avant le globule **/*.cr2. Par exemple, le remplacement de la commande shotwell ci-dessus par celle-ci ouvrira tous les fichiers .cr2 du sous-répertoire Pictures de votre répertoire personnel:

shotwell ~/Pictures/**/*.cr2

Contrairement à la première commande qui utilise votre répertoire actuel, quel que soit l'endroit où vous exécutez cette commande, vous dites à Shotwell d'ouvrir les mêmes fichiers.

Essai

Si vous devez vraiment utiliser le terminal pour cela, je suppose que cela fait peut-être partie de quelque chose de plus complexe. Si vous le souhaitez, vous pouvez tester ces commandes avant de les exécuter réellement en remplaçant shotwell par 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 doit être activée, ce que la commande shopt -s globstar (ci-dessus) a fait. S'il est déjà activé, vous n'avez pas besoin de plusieurs commandes. Et il vous suffit de définir globstar une fois par instance de shell.

Vous pouvez désactiver globstar en exécutant:

shopt -u globstar

Et vous pouvezvérifiersi globstar est activé ou désactivé en exécutant:

shopt globstar

Si vous utilisez globstar dans un script, vous devez envisager de le désactiver s'il se peut que du code apparaisse ensuite dans le même script, mais qu'il ne soit pas écrit dans le but de globstar. Par exemple, écrire ** lorsque vous voulez dire * ne pose généralement pas de problème lorsque Globstar est désactivé, mais si Globstar est activé, il peut en résulter de graves problèmes en faisant en sorte qu'une commande affecte beaucoup plus de fichiers que prévu.

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

shopt -u globstar dotglob nocaseglob

Par rapport à Globstar, il y a moins d'erreurs graves que vous pourriez commettre parce que vous avez oublié de laisser dotglob ou nocaseglob. Mais d’autres personnes (y compris celles que vous consultez sur des sites tels que Ask Ubuntu) supposent généralement que dotglob et nocaseglob sont désactivées lorsqu’elles vous suggèrent d’utiliser des commandes, sauf indication contraire de votre part.

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


Construire un nouvel arbre de répertoire

Puisque dans votre cas vous semblez vraiment avoir besoin de Shotwell pour afficher les fichiersonly//.cr2, vous avez des fichiers non -.cr2 dans les mêmes dossiers avec les fichiers .cr2 et une navigation dans les images dans Shotwell. offre automatiquement ces fichiers aussi , il semble que vous ayez besoin d'un dossier ne contenant pas d'autres fichiers image que les fichiers .cr2 que vous essayez d'ouvrir.

Déplacer les fichiers, comme vous l'avez suggéré , est une approche, mais je recommande plutôtcopierles fichiers ou, mieux,making liens symboliques aux fichiers(voir aussi FOLDOC ), car:

  • Si vous déplacez les fichiers d’un appareil à un autre, vous devez tout de même copier.
  • Si vous avez de la place, 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 satisfait que ce que vous avez fait est correct en fonction de vos besoins. Évidemment, cela 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 garder une trace facilement consultable 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 utilisé est extrêmement petite . (Si le disque cible estcomplètement plein, vous devrez toujours libérer de l'espace dessus - 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,flattening/ la hiérarchie de fichiers? Ou créez-vous des répertoires à la destination correspondant à chacun des répertoires de la source contenant au moins un fichier .cr2?

  • En aplatissant la hiérarchie des fichiers, vous pouvez facilement voir tous les fichiers en même temps. En particulier, il est facile de voir les noms et la taille 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 (vous pouvez toutefois revenir au 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 à des endroits différents . Si vous aplatissez la hiérarchie des fichiers, selon la méthode utilisée, soit la copie (ou le lien) échouera, sauf la première, et vous obtiendrez une erreur ou un avertissement, ou la totalité (sauf la dernière copie) ê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 déplacez "avec succès" plusieurs fichiers dans le même fichier, vous avez tout perdu 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 icicréent un nouvel arbre de répertoiresà la destination.

Voie 1: Copier

Je montre ceci en premier 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 n'a peut-être pas 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 ce que je pense que la plupart des gens dans cette situation préféreront, et des informations qui s'appliquent aux deux méthodes - des conseils de base sur l'échappement d'espaces dans les chemins - sont donnés ici plutôt qu'ici.

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

Remplacez src par le chemin du répertoire de niveau supérieur contenant tous vos fichiers CR2 et remplacez dest par le nom du répertoire que vous souhaitez créer, qui contiendra une hiérarchie de liens symboliques vers les fichiers CR2. Exécutez la procédure suivante:

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

N'oubliez pas le / après le nom du répertoire source, , à moins que vous ne souhaitiez créer un répertoire de niveau supérieur supplémentaire dansdest . Autrement dit, si vous omettez le / de fin, alors rsync créera le répertoire de destination pour vous, dansdest. Par exemple, supposons quesrcest un chemin relatif ne contenant aucun /. Ensuite:

  • Avec src/ dans votre commande rsync, vous obtenez un lien symbolique dest/foo/bar.cr2 pour le fichier src/foo/bar.cr2.
  • Avecsrcdans votre commande rsync, vous obtenez un lien symbolique dest/src/foo/bar.cr2 pour le fichier src/foo/bar.cr2.

Étant donné que le répertoire de niveau supérieur où les liens symboliques seront placés doit porter le même nom que celui du répertoire de niveau supérieur contenant les fichiers .cr2 auxquels les liens symboliques pointeront, cela risque de prêter à confusion, je vous recommande donc d'inclure le / à la fin de le nom du répertoire de destination dans votre commande rsync. (Et, pour le répertoire source, donnez-lui un répertoire vide, inexistant ou dédié à cet usage. Sinon, vous encombrerez un autre dossier.)

Comme c'est généralement le cas lorsque vous transmettez le nom d'un fichier ou d'un répertoire à un programme ou un script de ligne de commande, si les chemins d'accès au répertoire source ou source contiennent des espaces vides (ou des caractères traités spécialement par le shell, tels que \, $, ' , et divers autres ponctuation), alors vous devrez les citer . J'ai expliqué en détail comment procéder, dans le cas le plus courant d'espaces, dans "Méthode 2" - les conseils concernant les citations dans cette section s'appliquent également dans ce cas. Cependant, si vous ne savez pas comment citer le nom d'un dossier, vous pouvez faire en sorte que Ubuntu le fasse pour vous en faisant simplement glisser le dossier dans Temrminal;son chemin complet sera collé avec la citation correcte.

Après avoir copié uniquement les fichiers .cr2 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 d'exécuter rsync, je vous recommande de décider si vous souhaitez ignorer les entrées commençant par . et si vous le souhaitez. pour inclure des entrées avec des suffixes de variantes de casse. Si tel est le cas, vous devrez exécuter une commande rsync légèrement différente.

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

Vous pouvez utiliser une autre commande rsync pour indiquer si les fichiers et les répertoires commençant par un point doivent être ignorés et si vous souhaitez ou non tenir compte de la casse pour faire correspondre le suffixe .cr2.

La commande ci-dessusdoesinclude contient les répertoires et les fichiers dont le nom commence par .. . Pour exclure de tels fichiers et répertoires, placez --exclude='.*/' --exclude='.*' avant tous les autres --includes et --excludes. Autrement dit, utilisez plutôt cette commande rsync (avec les substitutions appropriées poursrcetdest, bien sûr):

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

Les commandes rsync présentées jusqu'ici ont été sensibles à la casse et ne copieront pas les fichiers se terminant par .CR2, .Cr2 ou .cR2 au lieu de .cr2. Si vous souhaitez que ces fichiers soient copiés, vous devrez en rendre compte en utilisant le modèle --include*.[cC][rR]2 à la place de *.cr2.

Cette troisième commande estinsensible à la casseet (comme la première commande)not/ ignore les fichiers et les répertoires dont le nom commence par .:

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

Si vous choisissez de copier les fichiers avec rsync et que vous ne savez pas laquelle de ces commandes vous voulez, , je vous suggère d'utiliser celui-ci si vous voulez vous assurer de ne rien manquer. Cependant, vous devez savoir que les fichiers de points peuvent contenir des métadonnées et que les fichiers de points nommés comme des images peuvent ne pas être réellement des images. Voir les discussions sur les fichiers de points dans la section"Lancer Shotwell avec une liste de noms de fichiers d'images"ci-dessus, et sur les fichiers de points et la sensibilité à la casse dans "Voie 2" ci-dessous.

Cette quatrième commande estinsensible à la casseet (comme la deuxième commande)doesignorer les fichiers et les répertoires dont le nom commence par .:

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

Voie 2: Créer des liens symboliques

C’est ce que je vous recommande de faire, même si la voie 1 est acceptable si vous avez assez d’espace sur le lecteur de destination. Vous n'êtes pas obligé de lire la voie 1 pour l'utiliser.

La méthode présentée ici crée une liste de fichiers .cr2 et parcourt la liste en créant des répertoires cible, le cas échéant, et en les renseignant avec des liens symboliques vers chaque fichier .cr2.

Ceci 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ù bon vous semble, mais par souci de commodité, je vais vous montrer comment le faire avec le script placé directement dans votre dossier personnel.

Écrivez (ou collez) le script.

Créez un fichier texte make-symlinks dans votre dossier personnel. 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. N'utilisez pas de traitement de texte tel que 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+D sur une nouvelle ligne, si vous vouliez.)

Si vous appelez le script autrement que make-symlinks, veillez à utiliser ce nom lors de l'exécution ultérieure de commandes utilisant le script.

#!/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 cela dans le fichier et enregistrez le fichier. Ce script utilise globstar, une fonctionnalité de Bash expliquée ci-dessus dans"Lancer Shotwell avec une liste de noms de fichiers images".

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

Selon vos besoins, vous voudrez peut-être apporter quelques modifications:

  • Si vous ne souhaitez pas inclure les fichiers .cr2 dont le nom commence par . ou qui résident dans des répertoires dont le nom commence par ., supprimez dotglob de la ligne shopt.

    Les fichiers et les répertoires dont le nom commence par . sont souvent utilisés pour les métadonnées (voir la section"Lancer Shotwell avec une liste de noms de fichiers d'images"ci-dessus). D'autre part, si vous voulez vous assurer que vous avez tout, ou s'il vous manque à peu près quelque chose inexplicablement, vous devriez alors garder dotglob.

  • Si vous souhaitez inclure uniquement les fichiers se terminant exactement par .cr2 maisnot/ variantes de cas (.CR2, .Cr2 et .cR2), vous devez supprimer nocaseglob. Puisque votre situation implique la récupération de données etShotwell ne vous montrera aucun des fichiers que vous avez manquéslorsque vous ouvrez le répertoire des liens symboliques - c’est le but de cette méthode, après tout - vous voudra probablement garder nocaseglob.

Rendez-le exécutable.

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

chmod +x ~/make-symlinks

Exécutez-le à la source et transmettez la destination en tant qu'argument.

Puis changez de répertoire dans le répertoire source, c’est-à-dire le dossier de niveau supérieur contenant les images. Par exemple, s'ils se trouvent dans le sous-répertoire Pictures de votre répertoire personnel, vous exécuterez:

cd ~/Pictures

C'est là que vous allez exécuter le script. Passez le répertoire de destination au script en tant qu'argument de ligne de commande.

Par exemple, si vous souhaitez qu'un répertoire appelé cr2s sur votre bureau contienne 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/MyDrive et que vous souhaitez créer un dossier appelé links pour 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 une citation. N'importe laquelle de ces œuvres (utilisez-en une seule, ne les exécutez pas toutes):

~/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-symlinks crée le répertoire de destination s'il n'existe pas déjà, tout comme il en crée des sous-répertoires. 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 erreurs failed to create symbolic link pour les liens symboliques existants, ce qui pourrait prêter à confusion.

Vous ne souhaitez probablement pas transmettre le nom d'un répertoire existant et contenant des fichiers sans lien (comme votre répertoire de base) à make-symlinks. Si vous le faites, vous pouvez vous attendre à créer toute une série de liens symboliques et de sous-dossiers. Vous voudrez probablement utiliser un nouveau répertoire - ou un répertoire qui n'existe pas encore - pour make-symlinks.

Importez l’arbre de liens symboliques nouvellement créé 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 contenant des images (y compris les sous-dossiers) dans Shotwell"). Par exemple, vous pouvez ouvrir Shotwell et faire glisser le dossier dans.

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

6
Eliah Kagan

Shotwell parcourt toutes les images présentes dans tous les répertoires dans lesquels une image est ouverte. Il est donc inutile d’utiliser find -name '*.cr2' -exec shotwell '{}' + comme je l’avais suggéré initialement. Étant donné que les paramètres de Shotwell sont plutôt limités, la seule façon pour moi d’ouvrir uniquement les fichiers de votre choix est de les déplacer eux-mêmes dans un nouveau répertoire.

Vous pouvez utiliser find pour cela:

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

Remplacez cp par mv si vous souhaitez éviter de créer des fichiers en double.

Remarques:

  • mkdir ~/cr2files crée un nouveau répertoire dans votre répertoire personnel
  • find recherche récursive du répertoire actuel vers le bas à travers l'arborescence
  • -type f rechercher uniquement des fichiers
  • -iname recherche les fichiers par nom, en ignorant la casse
  • '*.cr2' noms se terminant par .cr2 - utilisez des guillemets pour empêcher le shell de développer le glob avant qu'il ne soit passé à find
  • -not -path './dir/*' exclura le contenu du répertoire dir des résultats
  • {} représente les chemins des fichiers trouvés
  • -- après cp indique à cp de n'accepter aucune autre option, ce qui évite tout nom de fichier commençant par - et posant des problèmes

Vous pouvez ensuite ouvrir n’importe quel fichier du nouveau répertoire avec Shotwell et les parcourir tous.

5
Zanna

Option 1 - Utilisation de xargs lorsque les noms de fichiers contiennent des espaces

Comme l'ont souligné les commentaires ci-dessous, l'utilisation de back ticks (Option 3 ci-dessous) s'interrompt lorsque les noms de fichiers contiennent des espaces. La méthode plus sûre consistant à utiliser la commande find et à transmettre la sortie à shotwell à l'aide de l'option xargs se présente comme suit:

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

Le drapeau -print0 indique à find d'utiliser \0 délimiteurs (caractères nuls) entre les noms de fichiers, et le drapeau -0 indique à xargs d'attendre ces \0 délimiteurs.

Crédits aux excellentes réponses trouvées ici ( Comment rediffuser la liste des fichiers renvoyés par la commande find ) sur Stack Overflow.

Option 2 - Utiliser -exec lorsque les noms de fichiers contiennent des espaces

Comme le souligne un commentaire ci-dessous, l'option -exec 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 est supérieur. Cela ressemblerait à ceci:

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

Option 3 - Lorsque les noms de fichiers ne comportent pas d'espaces

Auparavant, avant que les noms de fichiers aient des espaces et devenaient 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 . De retour dans la journée, utiliser la commande find et transmettre le résultat à shotwell était la méthode la plus simple:

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

Ceci démarre la find du répertoire en cours et inclut tous les sous-répertoires:

  • Notez l'utilisation de back tick et non des guillemets simples ' au dessus de. Utiliser les mesures en arrière est similaire à l’expression de phrase dans $(...) dans bash.
  • Le premier argument . donne à find un point de départ qui correspond au répertoire en cours. Vous pouvez passer /home/$USER/Pictures ou quelque chose d'autre à la place de ..
  • Le deuxième argument -name indique à find de rechercher des noms de fichiers (et non des répertoires).
  • Cette technique fonctionne pour toutes les commandes, pas seulement shotwell. Vous pouvez l'utiliser pour cat, head, tail et la plupart des commandes Linux courantes.
1
WinEunuuchs2Unix