Ich möchte, dass shotwell alle .cr2-Dateien in einem Ordner und alle seine Unterordner öffnet. Welche Befehlszeile verwende ich?

9

Etwas wie

shotwell *.cr2 ./

Das funktioniert nicht, aber im Grunde möchte ich shotwell verwenden, um alle Dateien zu öffnen, die mit .cr2und im aktuellen Verzeichnis enden (einschließlich Unterordnern).

Der Kontext ist, dass mir Fotos fehlen, die ich mit meiner Kamera aufgenommen habe und die ich inzwischen von meiner Speicherkarte gelöscht habe.

Es gibt Thumbnails für sie in Shotwells "fehlenden Bildern", aber ich kann sie nicht finden. Also dachte ich, ich würde rennen photorec, um sie zu finden. Infolgedessen gab mir photorec eine Bootsladung Ordner und Dateien, die meine Festplatte füllten. Anstatt alle Dateien einzeln zu durchsuchen, habe ich mich entschlossen, auf meiner Festplatte nach .cr2-Dateien zu suchen und dabei einen bestimmten Ordner zu vermeiden Photogs, von dem ich weiß, dass er sie nicht enthält, da diese nicht Teil des photorecDatendumps waren.

user285884
quelle
@EliahKagan siehe Kommentare (die im Chat fortgesetzt wurden!) Für Details hier . Ich bin mir nicht sicher, ob und wie ich die Frage bearbeiten soll. Bitte raten Sie mir, da Sie eine so schöne Antwort erstellt haben
Zanna
@ user285884 Die letzten Änderungen an meiner Antwort beinhalten ein detailliertes Verfahren zum Erstellen eines Baums symbolischer Links zu nur .cr2-Dateien, die dann in Shotwell (und einigen anderen Methoden) geöffnet werden können. Dies sollte das Problem lösen, dass in Shotwell zusätzliche Nicht-CR2-Dateien angezeigt werden, sowie das Problem, dass auf dem Zielgerät nicht genügend Speicherplatz zum Verschieben oder Kopieren der Dateien vorhanden ist. Ich war mir aus dem entsprechenden Chat nicht sicher, ob Sie dies noch gelöst haben.
Eliah Kagan

Antworten:

6

Normalerweise möchten Sie Shotwell einfach öffnen und in den Ordner ziehen.

Bei Bedarf können Sie die Shell eine Liste von CR2-Dateien erstellen lassen und Shotwell anweisen, nur diese Dateien zu öffnen. Gelegentlich ist dies möglicherweise das, was Sie möchten, aber in diesem Fall hat dies aufgrund von Shotwells Verhalten - unter anderen Umständen eine Funktion - nicht automatisch das getan, was Sie brauchten , um automatisch andere Bilddateien (aller Art) anzuzeigen, die sich in der befinden dieselben Ordner wie die Bilder, die Sie geöffnet haben.

Um sicherzustellen, dass Shotwell nur über die Bilder Bescheid weiß, an denen Sie interessiert sind, können Sie den Verzeichnisbaum an eine andere Stelle klonen .cr2und nur Dateien und die Ordner kopieren , die sie enthalten, aber sonst nichts. Dies kann jedoch erheblichen zusätzlichen Platz beanspruchen. Ein anderer Ansatz besteht darin, eine Hierarchie symbolischer Links zu erstellen. Statt eines neuen Verzeichnisbaums mit Kopien Ihrer Originaldateien .cr2haben Sie einen neuen Verzeichnisbaum mit Syminks zu diesen. Dies nimmt viel weniger Platz ein.

Diese Antwort deckt alle diese Ansätze ab.

Öffnen eines Ordner mit Bildern (einschließlich Unterordnern) in Shotwell

Shotwell selbst bietet Ihnen zwei Möglichkeiten, um einen ganzen Verzeichnisbaum von Fotos zu öffnen. Wenn diese für Sie funktionieren, müssen Sie in der Befehlszeile nichts Kluges tun oder sie überhaupt verwenden. Wenn nicht, können Sie dies in Verbindung mit einer anderen Technik tun. (Wenn Sie beispielsweise ein neues Verzeichnis mit Symlinks oder Kopien Ihrer .cr2Dateien erstellen, können Sie es auf eine dieser Arten öffnen.)

Weg 1: Öffnen Sie einfach den gesamten Ordner in Shotwell.

Klicken Sie in Shotwell im Menü Datei auf Aus Ordner importieren . Wählen Sie dann den Ordner aus, aus dem Sie Bilder importieren möchten. Dies ist nicht auf .cr2Dateien beschränkt. Wenn Sie jedoch Dateien aus mehreren Unterordnern öffnen, die .cr2Bilder enthalten , die mit einer Digitalkamera erstellt wurden, sind dies höchstwahrscheinlich die einzigen vorhandenen Dateien.

Screenshot des Menüelements Aus Ordner importieren im Menü Datei von Shotwell.

Weitere Informationen finden Sie in Jakobs Antwort auf Alle Bilder rekursiv anzeigen (einschließlich aller Unterordner) .

Weg 2: Ziehen Sie den Ordner in Shotwell.

In den meisten Desktop-Umgebungen und Dateibrowsern können Sie Shotwell auch öffnen und den Ordner mit Ihren Bildern in das Shotwell-Fenster ziehen. Wie beim Importieren aus dem Ordner empfiehlt Shotwell, Fotos zu öffnen.

Screenshot von mir, wie ich meinen Desktop-Ordner in Shotwell ziehe, um die darin enthaltenen Bilder zu importieren.

Wenn Sie aus einem Dateibrowserfenster oder Ihrem Desktop in Shotwell ziehen, können Sie in eine bestimmte Bibliothek ziehen. Oder wenn Sie nicht mehrere Bibliotheken eingerichtet haben, können Sie einfach überall hin ziehen und es funktioniert. (Sie müssen nicht einmal in den linken Bereich ziehen.)

Diese Methode ist sehr praktisch und genauso leistungsfähig wie die manuelle Auswahl des Ordners (mit Datei > Aus Ordner importieren , wie oben beschrieben). Wenn Sie Dateien oder Ordner mit einer dieser Methoden öffnen, bietet Shotwell Ihnen die Möglichkeit, die Fotos zu öffnen, ohne sie in die Bibliothek zu kopieren.

Screenshot des Dialogfelds in Shotwell, in dem der Benutzer aufgefordert wird, zwischen dem Kopieren von Bildern an den Speicherort seiner Shotwell-Bibliothek oder dem Importieren von Bildern ohne Kopieren zu wählen.

Klicken Sie zum Importieren ohne Kopieren auf An Ort und Stelle importieren anstelle von Fotos kopieren .


Starten von Shotwell mit einer Liste von Bilddateinamen

Wenn Sie dies aus irgendeinem Grund tun möchten oder müssen, indem Sie einen Befehl im Terminal ausführen, können Sie den shotwellBefehl ausführen und den Dateinamen jedes Bildes als Argument an ihn übergeben. Globstar macht es einfach:

shopt -s globstar
shotwell **/*.cr2

Dadurch werden die .cr2Dateien geöffnet, die sich an einer beliebigen Stelle im aktuellen Verzeichnis befinden. Es unterscheidet sich vom Ausführen von Shotwell und dem anschließenden Ziehen des Ordners darin, dass Shotwell nur versucht, die Dateien zu importieren, deren Namen Sie ihm geben. Da Shotwell jedoch häufig andere Bilddateien aus denselben Ordnern anzeigt wie die Dateien, die Sie öffnen sollen, ist dies möglicherweise nicht für Ihre Anforderungen geeignet. ( Weitere Informationen, die Sie zu Ihrem Problem gegeben haben, deuten darauf hin, dass dies nicht der Fall ist . Eine Alternative finden Sie weiter unten.)

Dies schließt keine Dateien oder Unterordner ein, deren Namen mit beginnen. . Wenn Sie jedoch CR2-Dateien haben, deren Namen mit einem Punkt beginnen, möchten Sie sie die meiste Zeit wahrscheinlich sowieso nicht in Shotwell öffnen. Sofern Sie Ihre Dateien oder Ordner nicht absichtlich auf diese Weise benannt haben, ist eine Punktdatei mit einer Dateinamenerweiterung für Bilder oder Dokumente eher eine Metadatendatei als ein tatsächliches Bild oder Dokument. Beispielsweise fügt macOS beim Zugriff auf externe Medien (einschließlich Flash-Laufwerke und Digitalkameras) häufig solche Dateien hinzu (z. B. ._kittens.cr2für ein tatsächliches Bild kittens.cr2).

Wenn Sie auch Dateien suchen.. möchten , deren Namen mit beginnen oder die sich in Ordnern befinden, deren Namen mit beginnen , aktivieren Sie auch dotglob. Sie können dies mit shopt -s dotgloboder durch Übergeben von beiden globstarund dotgloban das shopteingebaute tun:

shopt -s globstar dotglob

Bei Globs wird standardmäßig zwischen Groß- und Kleinschreibung unterschieden. Aber möchten Sie vielleicht Dateinamen zwischen Groß- und unsensibel entsprechen , um offene Dateien mit der Endung .cr2, .Cr2, .cR2, und .CR2. Um das zu tun, entweder:

  • Aktivieren nocaseglob , indem Sie shopt -smit nocaseglob, entweder allein oder mit anderen Shell - Optionen. Zum Beispiel, um shotwellalle .cr2Dateien .auszuführen, ohne .Berücksichtigung der Groß- und Kleinschreibung zu suchen und -Dateien und Dateien in -Verzeichnissen einzuschließen:

    shopt -s globstar dotglob nocaseglob
    shotwell **/*.cr2
    
  • Oder verwenden Sie .[cC][rR]2statt .cr2in Ihrem Glob-Muster. Dies bewirkt beispielsweise dasselbe wie oben:

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

    Beachten Sie, dass die Groß- und Kleinschreibung völlig unabhängig davon ist, ob .Dateien und Ordner übereinstimmen oder nicht . Sie können dotglobaus den obigen Beispielen entfernen, und es kann immer noch die Groß- und Kleinschreibung nicht berücksichtigt werden.

Um ein Verzeichnis anzugeben, anstatt nur das aktuelle Verzeichnis zu verwenden, setzen Sie seinen Namen und ein /vor den **/*.cr2Glob. Wenn Sie beispielsweise den shotwellobigen Befehl durch diesen ersetzen, werden alle .cr2Dateien im PicturesUnterverzeichnis Ihres Home-Verzeichnisses geöffnet :

shotwell ~/Pictures/**/*.cr2

Anders als beim ersten Befehl, der Ihr aktuelles Verzeichnis verwendet, werden Sie Shotwell unabhängig davon, wo Sie diesen Befehl ausführen, anweisen, dieselben Dateien zu öffnen.

Testen

Wenn Sie das Terminal wirklich dafür verwenden müssen, dann schätze ich, dass es Teil von etwas Komplexerem sein kann. Wenn Sie möchten, können Sie solche Befehle testen , bevor sie tatsächlich ausgeführt wird durch den Ersatz shotwellmit printf '%s\n'. Anstatt die Dateinamen an Shotwell zu übergeben, werden sie pro Zeile aufgelistet. Zum Beispiel auf meinem Computer:

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

Globstar und andere Shell-Optionen deaktivieren

Die Globstar-Shell-Option ist aktiviert, wie es der shopt -s globstarBefehl (oben) getan hat. Wenn es bereits aktiviert ist, benötigen Sie nicht mehrere Befehle. Und Sie müssen globstar nur einmal pro Shell-Instanz festlegen.

Sie können globstar wieder ausschalten, indem Sie Folgendes ausführen:

shopt -u globstar

Und Sie können überprüfen, ob globstar ein- oder ausgeschaltet ist, indem Sie Folgendes ausführen:

shopt globstar

Wenn Sie globstar in einem Skript verwenden, sollten Sie in Betracht ziehen, es wieder zu deaktivieren, wenn möglicherweise Code in demselben Skript enthalten ist, das nicht für globstar geschrieben wurde. Zum Beispiel ist das Schreiben, **wenn Sie meinen, *normalerweise kein Problem, wenn globstar deaktiviert ist. Bei aktiviertem globstar kann es jedoch zu ernsthaften Problemen kommen, wenn ein Befehl weit mehr Dateien betrifft, als beabsichtigt.

Wenn Sie Dotglob oder Nocaseglob verwendet haben und diese ebenfalls deaktivieren möchten, können Sie dies auch mit shopt -u dotglobbzw. tun shopt -u nocaseglob. Sie können auch mehrere Shell-Optionen übergeben, shopt -uum sie gleichzeitig zu deaktivieren. Zum Beispiel zum Ausschalten globstar, dotglobund nocaseglob:

shopt -u globstar dotglob nocaseglob

Im Vergleich zu Globstar gibt es weniger schwerwiegende Fehler, die Sie möglicherweise machen, weil Sie vergessen haben, dass Sie Dotglob oder Nocaseglob aktiviert haben. Andere Personen (einschließlich Personen, die Sie auf Websites wie Ask Ubuntu konsultieren) gehen jedoch normalerweise davon aus, dass dotglob und nocaseglob deaktiviert sind, wenn sie Befehle zur Verwendung vorschlagen, sofern Sie ihnen nichts anderes mitteilen.

Weitere Informationen zu diesen Glob-bezogenen Shell-Optionen (und auch zu Globs im Allgemeinen ) finden Sie im Bash-Referenzhandbuch . Sie werden alle hauptsächlich in 4.3.2 The Shopt Builtin behandelt . Für globstar siehe auch 3.5.8.1 Pattern Matching . Für Dotglob siehe auch 3.5.8 Dateinamenerweiterung .


Erstellen eines neuen Verzeichnisbaums

Da Sie in Ihrem Fall Shotwell wirklich brauchen, um nur .cr2 Dateien anzuzeigen, haben Sie Nicht- .cr2Dateien in denselben Ordnern mit .cr2Dateien, und das Durchsuchen von Bildern in Shotwell bietet diese Dateien automatisch auch an . Es sieht so aus, als müssten Sie einen Ordner haben, der enthält keine anderen Bilddateien als die .cr2Dateien, die Sie öffnen möchten.

Die Dateien bewegen, wie Sie vorgeschlagen haben , ist ein Ansatz, aber ich empfehle stattdessen entweder das Kopieren der Dateien oder besser machen symbolische Links zu den Dateien (siehe auch FOLDOC ), denn:

  • Wenn Sie die Dateien geräteübergreifend verschieben, müssen Sie sie trotzdem kopieren. In diesem Fall ist das Verschieben nicht schneller.
  • Wenn Sie über ausreichend Speicherplatz verfügen, ist es häufig eine gute Idee, einen unveränderten Ordner mit allem, mit dem Sie begonnen haben, aufzubewahren, bis Sie zufrieden sind, dass das, was Sie getan haben, Ihren Anforderungen entspricht. Offensichtlich ist dies nicht immer anwendbar oder praktisch. In Ihrem Fall sind diese Dateien jedoch das Ergebnis einer Datenwiederherstellungsoperation. Es kann nützlich sein, eine leicht zu lesende Aufzeichnung darüber zu führen, was genau von wo wiederhergestellt wurde.
  • Wenn Sie symbolische Links erstellen, ist der zusätzliche Speicherplatz äußerst gering . (Wenn der Zieldatenträger jedoch vollständig gefüllt ist, müssen Sie dennoch Speicherplatz freigeben oder einen anderen Zieldatenträger verwenden, um Symlinks zu erstellen.)

Sie müssen noch eine weitere Entscheidung treffen. Erstellen Sie alle neuen Einträge (ob Kopien oder Symlinks) im selben Verzeichnis, wodurch die Dateihierarchie verringert wird? Oder erstellen Sie am Ziel Verzeichnisse, die jedem der Verzeichnisse an der Quelle entsprechen und mindestens eine .cr2Datei enthalten?

  • Durch Reduzieren der Dateihierarchie können Sie alle Dateien gleichzeitig auf einfache Weise anzeigen. Insbesondere ist es einfach, die Namen und Größen der Dateien auf einmal anzuzeigen und eine beliebige Kombination der Dateien in einem grafischen Dateibrowser auszuwählen.

  • Es gehen jedoch auch Informationen darüber verloren, in welchen Ordnern sie sich befanden, was möglicherweise hilfreich ist (obwohl Sie zum ursprünglichen Ordner zurückkehren und dort nach ihnen suchen können, wenn Sie die Dateien nicht verschieben).

  • Das größere Problem beim Reduzieren der Dateihierarchie ist jedoch, was passiert, wenn Sie zwei oder mehr Dateien mit demselben Namen an verschiedenen Stellen haben . Wenn Sie die Dateihierarchie reduzieren, werden je nach Vorgehensweise entweder alle bis auf die erste nicht kopiert (oder verknüpft) und Sie erhalten einen Fehler oder eine Warnung, oder alle bis auf die letzte Kopie (oder den letzten Link) werden überschrieben .

    Dies ist ein weiterer Grund, warum ich empfehle, Symlinks zu kopieren oder zu erstellen, anstatt Dateien zu verschieben. Wenn Sie mehrere Dateien "erfolgreich" in dieselbe Datei verschieben, haben Sie alle bis auf die letzte verloren!

Aufgrund der Nachteile, alles in ein einziges Verzeichnis ohne Unterverzeichnisse zu reduzieren, erstellen die hier verwendeten Ansätze einen neuen Verzeichnisbaum am Ziel.

Weg 1: Kopieren

Ich zeige dies zuerst, weil es etwas einfacher ist, aber ich schlage vor, dass Sie stattdessen symbolische Links erstellen ("Weg 2"), insbesondere wenn das Ziellaufwerk möglicherweise nicht genügend Speicherplatz für alle Dateien hat. "Weg 2", der etwas komplizierter ist, ist viel detaillierter, da es anscheinend weniger Ressourcen für die Verwendung dieser Technik gibt. Ich gehe davon aus, dass die meisten Menschen in dieser Situation dies bevorzugen und Informationen, die für beide Methoden gelten - Grundlegende Ratschläge zum Entkommen von Räumen in Pfaden - werden dort und nicht hier gegeben.

Wenn Sie einen Verzeichnisbaum kopieren und den Kopiervorgang anpassen müssen, sollten Sie normalerweise rsyncanstelle von verwenden cp. Dies ist einer dieser Fälle.

Durch Ersetzen srcdurch den Pfad zum Verzeichnis der obersten Ebene, das alle Ihre CR2-Dateien enthält, und Ersetzen destdurch den Namen des Verzeichnisses, das Sie erstellen möchten und das eine Hierarchie symbolischer Links zu den CR2-Dateien enthält, führen Sie Folgendes aus:

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

Vergessen Sie nicht /den Nachnamen des Quellverzeichnisses, es sei denn, Sie möchten, dass ein zusätzliches Verzeichnis der obersten Ebene darin erstellt wirddest . Das heißt, wenn Sie das Trailing weglassen /, rsyncwird das Zielverzeichnis für Sie im Inneren erstellt dest. Angenommen, es srchandelt sich um einen relativen Pfad, der no enthält /. Dann:

  • Mit src/in Ihrem rsyncBefehl erhalten Sie einen Symlink dest/foo/bar.cr2für die Datei src/foo/bar.cr2.
  • Mit srcin Ihrem rsyncBefehl erhalten Sie einen Symlink für die Datei .dest/src/foo/bar.cr2src/foo/bar.cr2

Da es für das Verzeichnis der obersten Ebene, in dem Symlinks platziert werden, verwirrend sein kann, denselben Namen wie das Verzeichnis der obersten Ebene zu haben, das die .cr2Dateien enthält, auf die die Symlinks verweisen, empfehle ich, das /am Ende des Ziels anzugeben Verzeichnisname in Ihrem rsyncBefehl. (Geben Sie für das Quellverzeichnis ein Verzeichnis an, das leer ist, nicht existiert oder anderweitig für diesen Zweck vorgesehen ist. Andernfalls werden Sie einen anderen Ordner überladen.)

Wie ist in der Regel der Fall , wenn Sie den Namen einer Datei oder ein Verzeichnis zu einem Kommandozeilen - Programm oder Skript übergeben, speziell behandelt , wenn Ihre Ziel- oder Quellverzeichnispfade enthalten keine Leerzeichen (oder Zeichen , die von der Schale, wie \, $, 'und verschiedenen andere Interpunktion), dann müssen Sie sie zitieren . Ich habe ausführlich beschrieben, wie dies für den häufigsten Fall von Leerzeichen in "Weg 2" getan wird - der Ratschlag zum Zitieren in diesem Abschnitt gilt auch hier. Wenn Sie sich jedoch nicht sicher sind, wie Sie den Namen eines Ordners angeben sollen, können Sie Ubuntu dies für Sie tun lassen, indem Sie den Ordner einfach in das Temrminal ziehen. Der vollständige Pfad wird mit korrektem Anführungszeichen eingefügt .

Nachdem Sie nur die .cr2Dateien und die Ordner kopiert haben , die sie enthalten, können Sie den Zielordner in Shotwell öffnen. (Siehe "Öffnen eines Ordners mit Bildern (einschließlich Unterordnern) in Shotwell" oben.) Bevor Sie jedoch ausführenrsync , sollten Sie entscheiden, ob Sie Einträge überspringen möchten, die mit beginnen, .und ob Sie Einträge mit Suffixen für Groß- und Kleinschreibung einschließen möchten. In diesem Fall müssen Sie einen etwas anderen rsyncBefehl ausführen .

Anpassen der Handhabung von gepunkteten Einträgen und der Groß- und Kleinschreibung

Möglicherweise möchten Sie einen anderen rsyncBefehl verwenden, um zu ändern, ob Dateien und Verzeichnisse, die mit einem Punkt beginnen, übersprungen werden und ob bei der Übereinstimmung mit dem Suffix die Groß- und Kleinschreibung berücksichtigt werden soll .cr2.

Der obige Befehl enthält Verzeichnisse und Dateien, deren Namen mit beginnen .. Um solche Dateien und Verzeichnisse auszuschließen, stellen Sie sie --exclude='.*/' --exclude='.*'vor alle anderen --includes und --excludes. Verwenden Sie rsyncstattdessen diesen Befehl (mit den entsprechenden Ersetzungen für srcund destnatürlich):

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

Die rsyncBefehle bisher gezeigt haben , case-sensitive gewesen und nicht das Kopieren von Dateien , dass Ende in .CR2, .Cr2oder .cR2nicht .cr2. Wenn Sie möchten, dass solche Dateien kopiert werden, müssen Sie dies berücksichtigen, indem Sie das --includeMuster *.[cC][rR]2anstelle von verwenden *.cr2.

Dieser dritte Befehl ist Groß- und Kleinschreibung und (wie der erste Befehl) nicht nicht überspringt Dateien und Verzeichnisse , deren Namen beginnen mit .:

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

Wenn Sie Dateien kopieren rsyncund sich nicht sicher sind, welchen dieser Befehle Sie möchten, empfehle ich die Verwendung dieses Befehls, wenn Sie sicherstellen möchten, dass Sie nichts verpassen. Beachten Sie jedoch, dass Punktedateien möglicherweise Metadaten enthalten und Punktedateien, die als Bilder bezeichnet werden, möglicherweise nicht wirklich Bilder sind. Siehe die Diskussionen zu Punktedateien im Abschnitt "Starten von Shotwell mit einer Liste von Bilddateinamen" oben und zu Punktedateien und Groß- und Kleinschreibung in "Weg 2" weiter unten.

Dieser vierte Befehl ist Groß- und Kleinschreibung und (wie der zweite Befehl) hat zum Überspringen von Dateien und Verzeichnisse , deren Namen beginnen mit .:

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

Weg 2: Symbolische Verknüpfungen erstellen

Ich empfehle Ihnen, dies zu tun, obwohl Weg 1 in Ordnung ist, wenn Sie genügend Speicherplatz auf dem Ziellaufwerk haben. Sie müssen Way 1 nicht lesen, um dies zu verwenden.

Die hier vorgestellte Methode erstellt eine Liste von .cr2Dateien und durchläuft die Liste, erstellt nach Bedarf Zielverzeichnisse und füllt sie mit symbolischen Links zu jeder .cr2Datei.

Dies ist gerade so kompliziert, dass ich vorschlage, es in ein Skript einzufügen, anstatt es nur interaktiv einzugeben. Sie können das Skript beliebig platzieren, aber der Einfachheit halber zeige ich Ihnen, wie Sie es mit dem Skript tun, das sich direkt in Ihrem Home-Ordner befindet.

Schreiben Sie das Skript (oder fügen Sie es ein).

Erstellen Sie eine Textdatei make-symlinksin Ihrem Home-Ordner. Es ist keine Dateierweiterung erforderlich.

Sie können dies mit jedem Texteditor wie Vim, Nano, Gedit oder Leafpad tun. Verwenden Sie jedoch kein Textverarbeitungsprogramm wie LibreOffice Writer. (Sie können dies sogar tun, indem Sie ausführen cat > ~/make-symlinks, den Inhalt der Datei einfügen und Ctrl+ Din einer neuen Zeile drücken , wenn Sie möchten.)

Wenn Sie dem Skript einen anderen Namen als geben make-symlinks, stellen Sie sicher, dass Sie diesen Namen verwenden, wenn Sie Befehle ausführen, die das Skript später verwenden.

#!/bin/bash

shopt -s globstar dotglob nocaseglob

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

Fügen Sie das in die Datei ein und speichern Sie die Datei. Dieses Skript verwendet globstar, eine Bash-Funktion, die oben unter "Starten von Shotwell mit einer Liste von Bilddateinamen" erläutert wurde .

Sie können den Umgang mit gepunkteten Einträgen und die Groß- und Kleinschreibung ändern.

Abhängig von Ihren Anforderungen möchten Sie möglicherweise einige Änderungen vornehmen:

  • Wenn Sie keine .cr2Dateien einschließen möchten, deren Namen mit beginnen .oder die sich in Verzeichnissen befinden, deren Namen mit beginnen ., entfernen Sie sie dotglobaus der shoptZeile.

    Dateien und Verzeichnisse, deren Name mit beginnt, .werden häufig für Metadaten verwendet (siehe Abschnitt "Starten von Shotwell mit einer Liste von Bilddateinamen" oben). Auf der anderen Seite sollten Sie behalten, wenn Sie sicherstellen möchten, dass Sie alles haben, oder wenn etwas Unerklärliches fehlt, von dem Sie ziemlich sicher sind, dass es vorhanden ist dotglob.

  • Wenn Sie nur das Ende in genau Dateien enthalten sein sollen , .cr2aber nicht Fall Varianten ( .CR2, .Cr2, und .cR2), dann sollten Sie entfernen nocaseglob. Da Ihre Situation eine Datenwiederherstellung beinhaltet und Shotwell Ihnen keine der Dateien anzeigt, die Sie beim Öffnen des Verzeichnisses symbolischer Links verpasst haben - das ist schließlich der Punkt dieser Methode -, möchten Sie wahrscheinlich behalten nocaseglob.

Mach es ausführbar.

Führen Sie diesen Befehl aus, um Ihre ausführbare Skriptdatei zu markieren:

chmod +x ~/make-symlinks

Führen Sie es an der Quelle aus und übergeben Sie das Ziel als Argument.

Wechseln Sie dann in das Quellverzeichnis, dh in den Ordner der obersten Ebene, der die Bilder enthält. Wenn sie sich beispielsweise im PicturesUnterverzeichnis Ihres Home-Verzeichnisses befinden, würden Sie Folgendes ausführen:

cd ~/Pictures

Hier führen Sie das Skript aus. Übergeben Sie das Zielverzeichnis als Befehlszeilenargument an das Skript.

Wenn Sie beispielsweise möchten cr2s, dass auf Ihrem Desktop ein Verzeichnis mit den symbolischen Links erstellt wird, führen Sie Folgendes aus:

~/make-symlinks ~/Desktop/cr2s

Oder wenn Sie dieses Verzeichnis nur direkt in Ihrem Home-Ordner haben möchten:

~/make-symlinks ~/cr2s

Oder wenn Sie ein Laufwerk gemountet haben /media/you/MyDriveund einen Ordner darauf erstellen möchten, der linksdie symbolischen Links enthält:

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

Wenn das Laufwerk jedoch /media/you/My Drive(mit einem Leerzeichen) ist, müssen Sie ein Anführungszeichen verwenden. Jedes dieser Werke (verwenden Sie nur eines, führen Sie nicht alle aus):

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

Aber wenn Sie ~für Ihr Home-Verzeichnis verwenden, zitieren Sie das nicht:

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

make-symlinksErstellt das Zielverzeichnis für Sie, falls es noch nicht vorhanden ist, genauso wie es darin Unterverzeichnisse erstellt. Es funktioniert jedoch weiterhin, wenn das Ziel bereits vorhanden ist.

Sie können es sogar mehrmals ausführen und dasselbe Zielverzeichnis übergeben (z. B. wenn Sie es mit Ctrl+ unterbrochen haben C). Es werden jedoch failed to create symbolic linkFehler für die bereits vorhandenen Symlinks angezeigt, was verwirrend sein kann.

Sie möchten wahrscheinlich nicht den Namen eines Verzeichnisses übergeben, das bereits vorhanden ist und nicht verwandte Dateien (wie Ihr Home-Verzeichnis) enthält make-symlinks. Wenn Sie dies tun, können Sie erwarten, dass eine ganze Reihe von Symlinks und Unterordnern darin erstellt werden. Sie möchten wahrscheinlich ein neues Verzeichnis verwenden - oder eines, das noch nicht existiert - für make-symlinks.

Importieren Sie den neu erstellten Symlink-Baum in Shotwell.

make-symlinksImportieren Sie nach dem Ausführen einfach das Verzeichnis, das Sie an Shotwell übergeben haben, mit einer der im ersten Teil dieser Antwort angegebenen Methoden ( "Öffnen eines Ordner mit Bildern (einschließlich Unterordnern) in Shotwell" ). Sie können beispielsweise Shotwell öffnen und den Ordner hineinziehen.

Da alle Einträge im Ordner entweder symbolische Links zu .cr2Dateien oder Verzeichnisse sind, die sie enthalten, ohne andere Dateitypen, sollte Shotwell keine der anderen Dateien sehen.

Eliah Kagan
quelle
5

Shotwell durchläuft alle Bilder in jedem Verzeichnis, in dem ein Bild geöffnet ist. Die Verwendung, find -name '*.cr2' -exec shotwell '{}' +wie ich ursprünglich vorgeschlagen habe, hilft also nicht wirklich. Da die Einstellungen von Shotwell eher begrenzt sind, kann ich mir nur vorstellen, nur die gewünschten Dateien zu öffnen, indem ich die Dateien selbst in ein neues Verzeichnis verschiebe.

Sie können dafür verwenden find:

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

Ersetzen Sie cpdurch, mvwenn Sie vermeiden möchten, dass doppelte Dateien erstellt werden.

Anmerkungen:

  • mkdir ~/cr2files Erstellen Sie ein neues Verzeichnis in Ihrem Home-Verzeichnis
  • find Suche rekursiv vom aktuellen Verzeichnis abwärts durch den Baum
  • -type f Suche nur nach Dateien
  • -iname Suche nach Dateien nach Namen, Groß- und Kleinschreibung ignorieren
  • '*.cr2'Namen, die mit .cr2- enden, verwenden Anführungszeichen, um zu verhindern, dass die Shell den Glob erweitert, bevor er an übergeben wirdfind
  • -not -path './dir/*'schließt den Inhalt des Verzeichnisses diraus den Ergebnissen aus
  • {} repräsentiert die Pfade der gefundenen Dateien
  • --Nachher cpist anzuweisen cp, keine weiteren Optionen zu akzeptieren, wodurch Dateinamen vermieden werden, die mit -Problemen beginnen

Sie können dann mit Shotwell eine beliebige Datei im neuen Verzeichnis öffnen und alle durchlaufen

Zanna
quelle
Warum werden dadurch auch JPG- und PNG-Dateien im Verzeichnis geöffnet? Ich sehe, dass es * .cr2 angibt? Wie kann ich nur .cr2-Dateien anzeigen, wenn ich den linken Pfeil auf shotwell drücke? Wenn ich ein \ anstelle eines + verwende, passiert nichts :(
user285884
Oh! Dies ist ein Problem @ user285884 Es tut mir leid, Shotwell durchläuft alle Bilder, die es im Verzeichnis findet ... Lassen Sie mich sehen, ob ich einen Weg finden kann, um es
Zanna
@ user285884 bearbeitet, aber ich kann keine elegante Lösung finden :(
Zanna
1
ok, danke für die Mühe! Was ist damit? Ich durchsuche das Verzeichnis nach .cr2-Dateien und verschiebe sie in einen separaten Ordner namens cr2files. Ich habe es in einem Unterordner mit mv * .cr2 ../cr2files/ gemacht und es hat funktioniert!. Wie mache ich das und gebe an, in welche Dateien ich schauen soll? So etwas wie "Hey Linux, schau in den Ordnern 1-10 nach .cr2-Dateien und verschiebe sie in den Ordner cr2files"? Danke Zanna
user285884
1
gut für einen Kontext, wo ich bin. Ich habe ein paar Bilder verloren. Also habe ich ein Foto gemacht und es gab mir eine Schiffsladung Ordner, genug, um meine gesamte Festplatte zu füllen. Ich möchte also alle Ordner auf meiner Festplatte durchsuchen, bis auf einen, da dieser eine Menge von .cr2-Dateien enthält, von denen ich weiß, dass sie nicht die sind, nach denen ich suche. Ich möchte also, dass Linux bis auf einen alle Ordner durchläuft. Ich bin nicht sicher, ob Ihr Code das tut. Was macht {}? Auch das "-" nach dem -v? Danke Zanna!
user285884
1

Option 1 - Verwenden, xargswenn Dateinamen Leerzeichen enthalten

Wie die folgenden Kommentare gezeigt haben, wird die Verwendung von back ticks(Option 3 unten) unterbrochen, wenn Dateinamen Leerzeichen enthalten. Die sicherere Methode, findBefehle zu verwenden und Ausgaben an shotwelldie xargsOption zu übergeben, sieht folgendermaßen aus:

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

Das -print0Flag weist find an, \0Trennzeichen zwischen Dateinamen zu verwenden (Nullzeichen), und das -0Flag weist darauf hin xargs, diese \0Trennzeichen zu erwarten .

Wir danken für die hervorragenden Antworten, die hier auf Stack Overflow gefunden wurden ( So leiten Sie eine Liste der vom Befehl find zurückgegebenen Dateien weiter ).

Option 2 - Verwenden, -execwenn Dateinamen Leerzeichen enthalten

Wie ein Kommentar unten hervorhebt, unterstützt die -execOption auch Dateinamen, die Leerzeichen enthalten. Andere Kommentare unten weisen darauf hin, dass dies unterbrochen wird, wenn die Anzahl der Dateien überschritten wird. Dies würde folgendermaßen aussehen:

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

Option 3 - Wenn Dateinamen keine Leerzeichen enthalten

In früheren Zeiten, bevor Dateinamen Leerzeichen hatten und 256 Zeichen lang wurden, funktionierte diese Option einwandfrei. Sie finden diese Option auf vielen anderen Websites, sollten diese Option jedoch nicht verwenden . Früher war es am einfachsten , den findBefehl zu verwenden und die Ausgabe an zu übergeben shotwell:

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

Dies startet das findaus dem aktuellen Verzeichnis und umfasst alle Unterverzeichnisse:

  • Beachten Sie die Verwendung von back tickund nicht von einfachen Anführungszeichen 'oben. Die Verwendung von Back-Ticks ähnelt dem Einfügen von Phrasen in $(...)Bash.
  • Das erste Argument .gibt findeinen Ausgangspunkt an, der das aktuelle Verzeichnis ist. Sie könnten passieren /home/$USER/Picturesoder etwas anderes statt ..
  • Das zweite Argument -nameweist find an, nach Dateinamen (nicht nach Verzeichnissen) zu suchen.
  • Diese Technik funktioniert für alle Befehle, nicht nur shotwell. dh Sie können es verwenden für cat, head, tailund die meisten anderen gängigen Linux - Befehle.
WinEunuuchs2Unix
quelle
Die Verwendung der Backticks ist verpönt und es gibt Probleme mit der Wortteilung. Ich würde empfehlen, dass Sie es in Pipe mit ändern xargs und -0alle Dateinamen verwenden. Verwenden Sie die NULL-Zeichenfolge als Trennzeichen
Sergiy Kolodyazhnyy
Das Problem mit dem Ansatz in dieser Antwort besteht darin, dass er das Falsche tut, wenn einer der Dateinamen oder Namen von Verzeichnissen, die die Dateien enthalten, Leerzeichen enthalten. Beachten Sie, dass viele $( )Benutzer zwar die Syntax der Befehlssubstitution der Syntax der Backtick-Befehlssubstitution vorziehen , dies jedoch für dieses Problem nicht relevant ist - beide schlagen auf genau dieselbe Weise fehl. @Serg Ich schlage vor, eine neue Antwort zu veröffentlichen, wie es geht xargs. (Das Einsetzen der Substitution " "würde auch nicht funktionieren: Alle findErgebnisse würden als ein einziges Argument übergeben.)
Eliah Kagan
Ich habe auch die xargsOption Stack Overflowbeim Schreiben dieser Antwort gesehen. Ich werde auch mit dieser Option erweitern. Leider musste ich heute Morgen mit Windows 8 booten, um eine beschädigte NTFSPartition zu reparieren, sodass das Testen problematisch war. Ich werde die Antwort jedoch später aktualisieren. Vielen Dank für den Hinweis :)
WinEunuuchs2Unix
warum nicht einfach benutzen -exec?
Zanna
@ Zanna Ich werde die -execOption auch hinzufügen :)
WinEunuuchs2Unix
-2

Mir war nicht bewusst, dass shotwell sogar Rohdateien geöffnet hat. Ich bin mir sicher, dass Sie mit Digikam oder Darktable mehr Kilometer sammeln können. Digikam wird mit einigen Kde-Komponenten geliefert und ist ein ziemlich guter Fotomanager. Darktable verfügt über sehr gute zerstörungsfreie Bearbeitungsfunktionen.

user114644
quelle
Können Sie diese Antwort (durch Bearbeiten ) um detaillierte Informationen zur Verwendung von Digikam (oder Darktable) zum Durchsuchen nur von .cr2Dateien in einem Ordner erweitern? Wenn ja, könnte dies wertvoll sein, da das Originalplakat Probleme hatte, Shotwell dazu zu bringen, nur die .cr2Dateien anzuzeigen. Obwohl ich meiner Antwort zusätzliche Ansätze hinzugefügt habe , um Shotwell zum Durchsuchen nur dieser und keiner anderen Dateien zu verwenden, vermute ich ziemlich stark, dass Shotwell nicht das beste Tool dafür ist.
Eliah Kagan