Voglio che shotwell apra tutti i file .cr2 in una cartella e tutte le sue sottocartelle, quale riga di comando devo usare?


9

Qualcosa di simile a

shotwell *.cr2 ./

Non funziona, ma sostanzialmente voglio usare shotwell per aprire tutti i file che terminano con .cr2e nella directory corrente (comprese le sottocartelle)

Il contesto è che mi mancano le foto che ho scattato sulla mia fotocamera che ho cancellato dalla mia scheda di memoria.

Ci sono miniature per loro nelle "immagini mancanti" di Shotwell ma non riesco a trovarle. Quindi ho pensato di correre photorecper cercare di trovarli. Di conseguenza, photorec mi ha dato un carico di cartelle e file, abbastanza da riempire il mio disco rigido. Invece di vagliare tutti i file uno per uno, ho deciso di cercare i file .cr2 sul mio disco rigido, evitando una particolare cartella chiamata Photogsche so che non li ha perché quelli non facevano parte del photorecdump dei dati.


@EliahKagan vedi commenti (che sono continuati in chat!) Per i dettagli qui . Non sono sicuro se e come modificare la domanda, quindi per favore avvisa, dato che hai creato una risposta così bella
Zanna

@ user285884 Le modifiche più recenti alla mia risposta includono una procedura dettagliata per la creazione di un albero di collegamenti simbolici a soli file .cr2, che possono quindi essere aperti in Shotwell (e alcuni altri metodi). Ciò dovrebbe superare il problema di vedere file extra, non .cr2 in Shotwell, nonché il problema di non avere abbastanza spazio sul dispositivo di destinazione per spostare o copiare i file. Non ero sicuro, dalla chat pertinente , se l'hai già risolto.
Eliah Kagan,

Risposte:


6

Di solito, ti consigliamo di aprire Shotwell e trascinare nella cartella.

Se necessario, è possibile fare in modo che la shell crei un elenco di file CR2 e dire a Shotwell di aprire solo quei file. Occasionalmente può essere quello che vuoi, ma in questo caso non ha fatto esattamente ciò di cui avevi bisogno a causa del comportamento di Shotwell - in alcune altre circostanze, una caratteristica - di mostrarti automaticamente altri file di immagini (di tutti i tipi) che risiedono nel stesse cartelle delle immagini che hai aperto.

Per essere sicuro che Shotwell sappia solo delle immagini che ti interessano, puoi clonare l'albero delle directory da qualche altra parte, copiando solo i .cr2file e le cartelle che li contengono, ma nient'altro. Tuttavia, ciò potrebbe richiedere un notevole spazio aggiuntivo. Quindi un altro approccio è quello di costruire una gerarchia di collegamenti simbolici - dove invece di avere un nuovo albero di directory di copie dei tuoi .cr2file originali , hai un nuovo albero di directory di simpatizzanti . Questo occupa molto meno spazio.

Questa risposta copre tutti quegli approcci.

Apertura di una cartella di immagini (comprese le sottocartelle) in Shotwell

Shotwell stesso offre due modi per aprire un intero albero di directory di foto. Se questi funzioneranno per te, non dovrai fare nulla di intelligente nella riga di comando o persino usarlo. Altrimenti, potresti finire per farlo in connessione con un'altra tecnica. (Ad esempio, se si finisce per creare una nuova directory di collegamenti simbolici o copie dei .cr2file, è possibile utilizzare uno di questi modi per aprirlo.)

Modo 1: basta aprire l'intera cartella in Shotwell.

In Shotwell, nel menu File , fai clic su Importa da cartella . Quindi selezionare la cartella da cui si desidera importare le immagini. Questo non si limiterà ai .cr2file, ma se stai aprendo file da più sottocartelle contenenti .cr2immagini create da una fotocamera digitale, molto probabilmente questi saranno gli unici file presenti.

Schermata della voce di menu Importa da cartella nel menu File di Shotwell.

Vedere la risposta di Jakob a Mostra tutte le immagini in modo ricorsivo (includere eventuali sottocartelle) per ulteriori informazioni.

Modo 2: trascina la cartella in Shotwell.

Con la maggior parte degli ambienti desktop e browser di file, è anche possibile aprire Shotwell e trascinare la cartella che contiene le immagini nella finestra di Shotwell. Come Importa da cartella , questo è un altro modo in cui Shotwell consiglia di aprire le foto.

Schermata di me trascinando la mia cartella Desktop in Shotwell per importare le immagini che contiene.

Quando si trascina da una finestra del browser di file o del desktop in Shotwell, è possibile trascinare in una libreria specifica. O se non hai impostato più librerie, puoi semplicemente trascinare praticamente ovunque e funziona. (Non è nemmeno necessario trascinare nel riquadro sinistro.)

Questo metodo è molto conveniente ed è potente quanto selezionare manualmente la cartella (con File > Importa da cartella , come descritto sopra). Quando apri file o cartelle utilizzando uno di questi metodi , Shotwell ti dà la possibilità di aprire le foto senza copiarle nella sua libreria.

Schermata della finestra di dialogo in Shotwell che chiede all'utente di scegliere tra la copia delle immagini nella posizione della loro libreria Shotwell o l'importazione in posizione, senza alcuna copia.

Per importare senza copiare, fai clic su Importa in posizione anziché su Copia foto .


Avvio di Shotwell con un elenco di nomi di file di immagini

Se per qualche motivo si desidera o è necessario farlo eseguendo un comando nel Terminale, è possibile eseguire il shotwellcomando e passargli il nome di ogni immagine come argomento. Globstar semplifica:

shopt -s globstar
shotwell **/*.cr2

Ciò apre i .cr2file situati ovunque nella directory corrente. Si differenzia dall'esecuzione di Shotwell e dal trascinamento della cartella, in quanto Shotwell proverà solo a importare i file di cui gli si assegna il nome. Tuttavia, poiché Shotwell mostra spesso altri file di immagine dalle stesse cartelle dei file che gli hai detto di aprire, questo potrebbe non essere adeguato alle tue esigenze. (E ulteriori informazioni che hai dato sul tuo problema suggeriscono che non lo è . Vedi sotto per un'alternativa.)

Ciò non include file o sottocartelle i cui nomi iniziano con. . Tuttavia, se hai file CR2 i cui nomi iniziano con un punto, probabilmente la maggior parte delle volte non vorrai aprirli in Shotwell. A meno che tu non abbia deliberatamente nominato i tuoi file o cartelle in questo modo, un dotfile con un'estensione di file di immagine o documento ha più probabilità di essere un file di metadati piuttosto che un'immagine o documento reale. Ad esempio, macOS spesso aggiunge tali file (ad es. ._kittens.cr2Per un'immagine reale kittens.cr2) quando si accede a supporti esterni (inclusi flash drive e fotocamere digitali).

Se vuoi trovare anche file i cui nomi iniziano con .o che si trovano in cartelle i cui nomi iniziano con. , abilita anche dotglob. Puoi farlo con shopt -s dotglobo passando entrambi globstare dotglobal shoptbuiltin:

shopt -s globstar dotglob

Per impostazione predefinita, i globs fanno distinzione tra maiuscole e minuscole. Ma si potrebbe desiderare per abbinare i nomi dei file è case-sensitive , in modo da aprire i file che terminano in .cr2, .Cr2, .cR2, e .CR2. Per fare ciò, sia:

  • Abilita nocaseglob eseguendolo shopt -scon nocaseglob, da solo o con altre opzioni di shell. Ad esempio, per essere eseguito shotwellsu tutti i .cr2file, cercando tra maiuscole e minuscole e includendo .-file e file in .-directory:

    shopt -s globstar dotglob nocaseglob
    shotwell **/*.cr2
    
  • In alternativa , utilizzare .[cC][rR]2anziché .cr2nel modello glob stesso. Ad esempio, questo compie lo stesso di cui sopra:

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

    Si noti che la distinzione tra maiuscole e minuscole è completamente separata dalla corrispondenza dei .file e delle cartelle. È possibile rimuovere dotglobdagli esempi precedenti e possono comunque non distinguere tra maiuscole e minuscole.

Per specificare una directory anziché semplicemente utilizzare la directory corrente, inserire il suo nome e un /prima del **/*.cr2glob. Ad esempio, la sostituzione del shotwellcomando sopra con questo aprirà tutti i .cr2file all'interno della Picturessottodirectory della home directory:

shotwell ~/Pictures/**/*.cr2

A differenza del primo comando che utilizza la directory corrente, indipendentemente da dove si esegue quel comando, verrà chiesto a Shotwell di aprire gli stessi file.

analisi

Se devi davvero usare il terminale per questo, allora immagino che possa far parte di qualcosa di più complesso. Se lo desideri, puoi testare tali comandi prima di eseguirli effettivamente sostituendoli shotwellcon printf '%s\n'. Invece di passare i nomi dei file a Shotwell, li elenca uno per riga. Ad esempio, sulla mia macchina:

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

Disattivazione di Globstar e altre opzioni di shell

L'opzione shell globstar è stata abilitata per funzionare, ed è ciò che ha fatto il shopt -s globstarcomando (sopra). Se è già abilitato, non sono necessari più comandi. E devi solo impostare globstar una volta per istanza della shell.

Puoi disattivare globstar eseguendo:

shopt -u globstar

E puoi verificare se globstar è acceso o spento eseguendo:

shopt globstar

Se stai usando globstar in uno script, dovresti considerare di disattivarlo se potrebbe esserci del codice che segue nello stesso script che non è stato pensato pensando a globstar. Ad esempio, scrivere **quando intendi di *solito non è un problema quando globstar è disabilitato, ma con globstar attivata, può causare seri problemi facendo in modo che un comando influenzi molto più file di quanto si pensi.

Allo stesso modo, se hai usato dotglob o nocaseglob e vuoi anche disattivarli, puoi farlo con shopt -u dotglobe shopt -u nocaseglob, rispettivamente. Puoi anche passare più opzioni di shell shopt -uper disinserirle contemporaneamente. Ad esempio, per disattivare globstar, dotglobe nocaseglob:

shopt -u globstar dotglob nocaseglob

Rispetto a globstar, ci sono meno errori gravi che potresti fare perché hai dimenticato di aver lasciato dotglob o nocaseglob. Ma altre persone (incluse le persone che consulti su siti come Ask Ubuntu) di solito assumono che dotglob e nocaseglob siano disabilitati quando ti suggeriscono comandi da usare, a meno che tu non dica diversamente.

Per ulteriori informazioni su queste opzioni di shell relative a glob (e anche su globs in generale ), consultare il manuale di riferimento di bash . Sono tutti trattati principalmente in 4.3.2 The Shopt Builtin . Per globstar, vedere anche 3.5.8.1 Pattern Matching . Per dotglob, vedere anche 3.5.8 Espansione nome file .


Creazione di un nuovo albero di directory

Poiché nel tuo caso sembra che tu abbia davvero bisogno di Shotwell per mostrare solo i .cr2 file, hai non .cr2file nelle stesse cartelle con i .cr2file e la navigazione delle immagini in Shotwell offre automaticamente anche quei file , sembra che tu debba avere una cartella che non contiene altri file di immagine oltre ai .cr2file che stai tentando di aprire.

Spostare i file, come hai suggerito , è un approccio, ma raccomando invece di copiarli o, meglio, di creare collegamenti simbolici ai file (vedi anche FOLDOC ), perché:

  • Se si spostano i file su più dispositivi, è comunque necessario copiarli, quindi in tal caso lo spostamento non è più veloce.
  • Se hai lo spazio, è spesso una buona idea tenere una cartella non modificata di tutto ciò che hai iniziato fino a quando non sei soddisfatto che ciò che hai fatto sia corretto in base alle tue esigenze. Ovviamente questo non è sempre applicabile o pratico. Ma nel tuo caso, questi file sono il risultato di un'operazione di recupero dei dati. Può essere utile tenere un registro facilmente leggibile di ciò che è stato recuperato e da dove.
  • Se si sceglie di creare collegamenti simbolici, la quantità di spazio aggiuntivo consumato è estremamente ridotta . (Se il disco di destinazione è completamente pieno , tuttavia, sarà comunque necessario liberare spazio su di esso - o utilizzare un disco di destinazione diverso - per creare collegamenti simbolici.)

C'è anche un'altra decisione da prendere. Crei tutte le nuove voci (siano esse copie o collegamenti simbolici) nella stessa directory, appiattendo la gerarchia dei file? O crei directory nella destinazione corrispondenti a ciascuna delle directory nell'origine che contengono almeno un .cr2file?

  • L'appiattimento della gerarchia dei file consente di visualizzare tutti i file contemporaneamente, facilmente. In particolare, è facile visualizzare contemporaneamente i nomi e le dimensioni dei file, nonché selezionare qualsiasi combinazione di file in un browser di file grafico.

  • Ma perde anche informazioni su quali cartelle si trovavano, il che può essere utile (anche se puoi tornare alla cartella originale e cercarle lì se non sposti i file).

  • Il problema più grande con l'appiattimento della gerarchia dei file, tuttavia, è cosa succede se si hanno due o più file con lo stesso nome in luoghi diversi . Se si appiattisce la gerarchia dei file, a seconda di come lo si fa, o tutti, tranne il primo, non verranno copiati (o collegati) e si otterrà un errore o un avviso, oppure tutti tranne l'ultima copia (o collegamento) essere sovrascritto .

    Questo è un altro motivo per cui consiglio di copiare o creare collegamenti simbolici anziché spostare file. Se "correttamente" sposti più file nello stesso file, hai perso tutto tranne l'ultimo!

A causa degli svantaggi di appiattire tutto in una singola directory senza sottodirectory, gli approcci che prendo qui costruiscono un nuovo albero di directory a destinazione.

Modo 1: copia

Lo mostro prima perché è un po 'più semplice, ma suggerisco invece di creare collegamenti simbolici ("Way 2"), specialmente se l'unità di destinazione potrebbe non avere abbastanza spazio per contenere tutti i file. "Way 2", che è un po 'più complicato, è molto più dettagliato perché sembrano esserci meno risorse su come usare quella tecnica, è il modo in cui mi aspetto che la maggior parte delle persone in questa situazione preferisca, e le informazioni che si applicano ad entrambi i metodi - vengono forniti consigli di base sulla fuga di spazi nei percorsi - piuttosto che qui.

Quando è necessario copiare un albero di directory e è necessario personalizzare l'operazione di copia, in genere è necessario utilizzare rsyncinvece di cp. Questo è uno di quei casi.

Sostituendo srccon il percorso della directory di livello superiore contenente tutti i file CR2 e sostituendo destcon il nome della directory che si desidera creare che conterrà una gerarchia di collegamenti simbolici ai file CR2, eseguire:

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

Non dimenticare il /nome dopo la directory di origine, a meno che tu non voglia creare una directory di livello superiore aggiuntiva all'internodest . Cioè, se ometti il ​​trailing /, allora rsynccreerai la directory di destinazione per te, dentro dest. Ad esempio, supponiamo che srcsia un percorso relativo contenente no /. Poi:

  • Con src/nel tuo rsynccomando, ottieni un link simbolico dest/foo/bar.cr2per il file src/foo/bar.cr2.
  • Con srcnel tuo rsynccomando, ottieni un link simbolico per il file .dest/src/foo/bar.cr2src/foo/bar.cr2

Dal momento che potrebbe essere fonte di confusione per la directory di livello superiore in cui verranno posizionati i collegamenti simbolici con lo stesso nome di quella della directory di livello superiore contenente i .cr2file a cui rimandano i collegamenti simbolici, si consiglia di includere /alla fine della destinazione nome della directory nel tuo rsynccomando. (E, per la directory di origine, assegnagli una directory vuota, che non esiste o che è altrimenti dedicata a questo scopo. Altrimenti, ingombra qualche altra cartella.)

Come è generalmente il caso quando si passa il nome di un file o una directory a un programma da riga di comando o uno script, se i percorsi di directory di destinazione o di origine contengono spazi vuoti (o caratteri trattate in modo speciale dalla shell, come \, $, ', e varie altre punteggiatura), quindi dovrai citarle . Ho dettagliato come fare questo, per il caso più comune di spazi, in "Way 2" - i consigli sulla citazione in quella sezione si applicano anche qui. Tuttavia, se non sei sicuro di come citare il nome di una cartella, puoi fare in modo che Ubuntu lo faccia per te semplicemente trascinando la cartella nel Temrminal; il suo percorso completo verrà incollato con la citazione corretta .

Dopo aver copiato solo i .cr2file e le cartelle che li contengono, è possibile aprire la cartella di destinazione in Shotwell. (Vedi "Apertura di una cartella di immagini (comprese le sottocartelle) in Shotwell" sopra.) Tuttavia, prima di eseguire rsync, ti consiglio di decidere se vuoi saltare le voci che iniziano con .e se vuoi includere le voci con suffissi case-variant. In tal caso, dovrai eseguire un rsynccomando leggermente diverso .

Personalizzazione del trattamento delle voci tratteggiate e della distinzione tra maiuscole e minuscole

È possibile che si desideri utilizzare un rsynccomando diverso per modificare se i file e le directory che iniziano con un punto vengono saltati e se si desidera o meno la distinzione tra maiuscole e minuscole nella corrispondenza del suffisso .cr2.

Il comando precedente non includere le directory ei file i cui nomi iniziano con .. Per escludere tali file e directory, mettere --exclude='.*/' --exclude='.*'prima di tutti gli altri --includes e --excludes. Cioè, utilizzare questo rsynccomando invece (con le sostituzioni appropriate per srce dest, ovviamente):

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

I rsynccomandi mostrati finora sono stati-sensitive e non copiare i file che terminano in .CR2, .Cr2o .cR2piuttosto che .cr2. Se desideri che tali file vengano copiati, dovrai tenerne conto utilizzando il --includemodello *.[cC][rR]2al posto di *.cr2.

Questo terzo comando non fa distinzione tra maiuscole e minuscole e (come il primo comando) non salta i file e le directory i cui nomi iniziano con .:

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

Se segui l'approccio della copia dei file rsynce non sei sicuro di quale di questi comandi desideri, ti suggerisco di usarlo se vuoi assicurarti di non perdere nulla. Tuttavia, è necessario essere consapevoli del fatto che i file dot possono contenere metadati e i file dot denominati come immagini potrebbero non essere realmente immagini. Vedi le discussioni sui dotfile nella sezione "Avvio di Shotwell con un elenco di nomi di file immagine" sopra, e sui dotfile e la distinzione tra maiuscole e minuscole nel "Modo 2" di seguito.

Questo quarto comando è case-insensitive e (come il secondo comando) fa i file e le directory di salto i cui nomi iniziano con .:

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

Modo 2: creazione di collegamenti simbolici

Questo è quello che ti consiglio di fare, sebbene Way 1 vada bene se hai abbastanza spazio sull'unità di destinazione. Non è necessario leggere il Modo 1 per utilizzare questo.

Il metodo presentato qui crea un elenco di .cr2file e scorre l'elenco, creando directory di destinazione secondo necessità e popolandole con collegamenti simbolici a ciascun .cr2file.

Questo è abbastanza complicato che suggerisco di inserirlo in uno script piuttosto che digitarlo in modo interattivo. Puoi mettere lo script dove vuoi, ma per comodità, ti mostrerò come farlo con lo script posizionato direttamente nella tua cartella home.

Scrivi (o incolla) lo script.

Crea un file di testo make-symlinks, nella cartella home. Non è necessaria l'estensione del file.

Puoi farlo con qualsiasi editor di testo, come Vim, Nano, Gedit o Leafpad. Tuttavia, non utilizzare un elaboratore di testi come LibreOffice Writer. (Puoi anche farlo eseguendo cat > ~/make-symlinks, incollando il contenuto del file e premendo Ctrl+ Dsu una nuova riga, se lo desideri.)

Se si assegna un nome diverso allo script make-symlinks, assicurarsi di utilizzare quel nome quando si eseguono comandi che utilizzano lo script in un secondo momento.

#!/bin/bash

shopt -s globstar dotglob nocaseglob

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

Inseriscilo nel file e salva il file. Questo script utilizza globstar, una funzionalità di Bash spiegata sopra in "Avvio di Shotwell con un elenco di nomi di file di immagini" .

Puoi modificare il modo in cui gestisce le voci tratteggiate e la distinzione tra maiuscole e minuscole.

A seconda delle tue esigenze, potresti voler apportare alcune modifiche:

  • Se non si desidera includere .cr2file i cui nomi iniziano con .o che risiedono in directory i cui nomi iniziano con ., rimuovere dotglobdalla shoptriga.

    I file e le directory il cui nome inizia con .vengono spesso utilizzati per i metadati (vedere la sezione "Avvio di Shotwell con un elenco di nomi di file immagine" sopra). D'altra parte, se vuoi assicurarti di avere tutto, o se c'è qualcosa di inspiegabilmente mancante che sei abbastanza sicuro che ci sia, allora dovresti continuare dotglob.

  • Se si desidera includere solo i file che terminano in esattamente .cr2, ma non varianti di casi ( .CR2, .Cr2, e .cR2), quindi è necessario rimuovere nocaseglob. Poiché la tua situazione comporta il recupero dei dati e Shotwell non ti mostrerà nessuno dei file che hai perso quando apri la directory dei collegamenti simbolici - questo è il punto di questo metodo, dopo tutto - probabilmente vorrai conservare nocaseglob.

Renderlo eseguibile.

Esegui questo comando per contrassegnare il tuo script eseguibile:

chmod +x ~/make-symlinks

Eseguilo alla fonte e passa la destinazione come argomento.

Quindi passare alla directory di origine, ovvero alla cartella di livello superiore che contiene le immagini. Ad esempio, se si trovano nella Picturessottodirectory della home directory, eseguire:

cd ~/Pictures

Qui è dove eseguirai lo script. Passa la directory di destinazione allo script come argomento della riga di comando.

Ad esempio, se si desidera cr2screare una directory chiamata da creare sul desktop per contenere i collegamenti simbolici, eseguire:

~/make-symlinks ~/Desktop/cr2s

O se vuoi semplicemente quella directory direttamente nella tua cartella home:

~/make-symlinks ~/cr2s

Oppure se hai un'unità montata su /media/you/MyDrivee vuoi creare una cartella chiamata linksper contenere i collegamenti simbolici:

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

Ma se l'unità è /media/you/My Drive(con uno spazio), è necessario utilizzare la citazione. Una di queste opere (usane solo una, non eseguirle tutte):

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

Ma se usi ~per la tua home directory, non citare che:

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

make-symlinkscrea la directory di destinazione per te se non esiste già, così come crea sottodirectory al suo interno. Tuttavia, funziona ancora se la destinazione esiste già.

Puoi anche eseguirlo più volte e passare la stessa directory di destinazione (ad esempio, se lo hai interrotto con Ctrl+ C), anche se otterrai failed to create symbolic linkerrori per i collegamenti simbolici già esistenti e che potrebbero creare confusione.

Probabilmente non vuoi passare il nome di una directory che esiste già e contiene file non correlati (come la tua home directory) a make-symlinks. In tal caso, puoi aspettarti di creare un sacco di symlink e sottocartelle. Probabilmente vuoi usare una nuova directory - o una che non esiste ancora - per make-symlinks.

Importare l'albero dei collegamenti simbolici appena creato in Shotwell.

Dopo l'esecuzione make-symlinks, importa semplicemente la directory che hai passato in Shotwell, utilizzando uno dei metodi indicati nella prima parte di questa risposta ( "Apertura di una cartella di immagini (comprese le sottocartelle) in Shotwell" ). Ad esempio, è possibile aprire Shotwell e trascinare la cartella in.

Poiché tutte le voci nella cartella sono collegamenti simbolici a .cr2file o directory che li contengono, senza altri tipi di file, Shotwell non dovrebbe vedere nessuno degli altri file.


5

Shotwell scorrerà in rassegna tutte le immagini presenti in ogni directory in cui un'immagine è aperta, quindi l'utilizzo find -name '*.cr2' -exec shotwell '{}' +come suggerito inizialmente non aiuta davvero. Poiché le impostazioni di Shotwell sono piuttosto limitate, l'unico modo in cui riesco a pensare di aprire solo i file desiderati è spostare i file in una nuova directory da soli.

Puoi usare findper quello:

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

Sostituire cpcon mvse si desidera evitare la creazione di file duplicati.

Appunti:

  • mkdir ~/cr2files crea una nuova directory nella tua home directory
  • find cerca ricorsivamente dalla directory corrente verso il basso attraverso l'albero
  • -type f cerca solo i file
  • -iname cerca i file per nome, ignorando il caso
  • '*.cr2'nomi che terminano con .cr2- usa le virgolette per impedire alla shell di espandere il glob prima che venga passatofind
  • -not -path './dir/*'escluderà il contenuto della directory dirdai risultati
  • {} rappresenta i percorsi dei file trovati
  • --dopo cpè dire di cpnon accettare ulteriori opzioni, il che evita qualsiasi nome di file che inizi a -causare problemi

È quindi possibile aprire qualsiasi file nella nuova directory con Shotwell e scorrere tutti


perché questo apre anche i file .jpg e .png nella directory? Vedo che specifica * .cr2? Come faccio a vedere i file .cr2 quando premo la freccia sinistra su shotwell? Se uso un \ anziché un +, non succede nulla :(
user285884

Oh! questo è un problema @ user285884 Mi dispiace, shotwell scorre tutte le immagini che trova nella directory ... fammi vedere se riesco a trovare un modo per aggirarlo ...
Zanna

@ user285884 modificato, ma non riesco a trovare una soluzione elegante :(
Zanna

1
ok, grazie per lo sforzo! che dire di questo, cerco nella directory i file .cr2 e li sposto in una cartella separata chiamata cr2files. L'ho fatto in una sottocartella usando mv * .cr2 ../cr2files/ e ha funzionato !. Tuttavia, come posso fare e specificare quali file esaminare? Qualcosa come "hey linux guarda le cartelle 1-10 per i file .cr2 e spostalo nella cartella cr2files"? Grazie Zanna
user285884

1
bene per qualche contesto su dove sono. Ho perso alcune foto. Così ho fatto un photorec e mi ha dato un sacco di cartelle, abbastanza da riempire il mio intero disco rigido. Quindi voglio cercare in tutte le cartelle nel mio disco rigido tranne uno perché quello ha una tonnellata di file .cr2 che so non sono quelli che sto cercando. Quindi voglio che Linux passi attraverso tutte le cartelle tranne una. Non sono sicuro che il tuo codice lo faccia. Cosa fa? Anche il "-" dopo il -v? Grazie Zanna!
user285884

1

Opzione 1: utilizzare xargsquando i nomi dei file contengono spazi

Come hanno sottolineato i commenti seguenti, l'utilizzo di back ticks(Opzione 3 di seguito) si interromperà quando i nomi dei file contengono spazi. Il metodo più sicuro di usare il findcomando e passare l'output shotwellall'utilizzo xargsdell'opzione è simile al seguente:

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

Il -print0flag dice a find di usare \0delimitatori (carattere null) tra i nomi di file e il -0flag dice xargsdi aspettarsi questi \0delimitatori.

Ringraziamo le eccellenti risposte trovate qui ( Come eseguire il pipe dell'elenco dei file restituiti dal comando find ) su Stack Overflow.

Opzione 2: utilizzare -execquando i nomi dei file contengono spazi

Come sottolinea un commento di seguito, l' -execopzione supporta anche nomi di file contenenti spazi. Altri commenti qui sotto sottolineano che si interrompe quando il numero di file supera Questo sarebbe simile a questo:

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

Opzione 3: quando i nomi dei file non hanno spazi

Ai vecchi tempi, prima che i nomi dei file avessero spazi e diventassero lunghi 256 caratteri questa opzione funzionava bene. Troverai questa opzione menzionata su molti altri siti web ma non dovresti usare questa opzione . In findpassato , usare il comando e passare l'output a shotwellera il metodo più semplice:

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

Questo avvia il finddalla directory corrente e include tutte le sottodirectory:

  • Nota l'uso di back ticke non virgolette singole 'sopra. L'uso di back-tick è simile a racchiudere la frase in $(...)bash.
  • Il primo argomento .fornisce findun punto di partenza che è la directory corrente. Potresti passare /home/$USER/Pictureso qualcos'altro invece di ..
  • Il secondo argomento -namedice a find di cercare i nomi dei file (non le directory).
  • Questa tecnica funziona per tutti i comandi, non solo shotwell. cioè Si può usare per cat, head, taile la maggior parte degli altri comandi popolari di Linux.

L'uso dei backtick è un po 'disapprovato, inoltre ha problemi con la divisione delle parole. Ti consiglierei di cambiarlo in pipe con xargs e usare -0tutti i nomi di file usa la stringa NULL come separatore
Sergiy Kolodyazhnyy

Il problema con l'approccio in questa risposta è che fa la cosa sbagliata quando uno dei nomi di file, o qualsiasi nome di directory che contiene i file, ha spazi. Si noti che, sebbene molte persone preferiscano la $( )sintassi di sostituzione dei comandi alla sintassi di sostituzione dei comandi backtick, ciò non è rilevante per questo problema: entrambi falliscono esattamente allo stesso modo. @Serg Suggerisco di pubblicare una nuova risposta su come farlo xargs. (Anche la sostituzione " "non funzionerebbe: tutti i findrisultati sarebbero passati come un unico argomento.)
Eliah Kagan

Ho anche visto l' xargsopzione attiva Stack Overflowquando scrivevo questa risposta. Espanderò anche con quell'opzione. Sfortunatamente ho dovuto avviare Windows 8 questa mattina per correggere la NTFSpartizione danneggiata , quindi i test erano problematici. Aggiornerò la risposta più tardi però. Grazie per averlo segnalato :)
WinEunuuchs2Unix il

perché non usare solo -exec?
Zanna,

@Zanna Aggiungerò anche l' -execopzione :)
WinEunuuchs2Unix

-2

Non sapevo che Shotwell aprisse anche file non elaborati. Sono certo che potresti ottenere più chilometri con digikam o darktable. Digikam viene fornito con alcuni componenti Kde ed è un ottimo gestore di foto. Darktable ha ottime capacità di editing non distruttivo.


Puoi espandere questa risposta ( modificando ) per includere informazioni dettagliate su come usare Digikam (o Darktable) per sfogliare solo i .cr2file in una cartella? In tal caso, questo potrebbe essere prezioso, dal momento che il poster originale ha avuto problemi a far sì che Shotwell mostrasse solo i .cr2file. Anche se ho aggiunto ulteriori approcci alla mia risposta per rendere possibile l'uso di Shotwell per sfogliare solo quei file e nessun altro, sospetto fortemente che Shotwell non sia lo strumento migliore per questo.
Eliah Kagan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.