Quero que o shotwell abra todos os arquivos .cr2 em uma pasta e todas as suas subpastas, que linha de comando eu uso?


9

Algo como

shotwell *.cr2 ./

Isso não funciona, mas basicamente eu quero usar o shotwell para abrir todos os arquivos que terminam com .cr2e no diretório atual (incluindo subpastas)

O contexto é que faltam as fotos que tirei na minha câmera e que foram excluídas do cartão de memória.

Existem miniaturas para eles nas "imagens ausentes" de shotwell, mas não consigo encontrá-las. Então imaginei que correria photorecpara tentar encontrá-los. Como resultado, o photorec me deu um monte de pastas e arquivos, o suficiente para encher meu disco rígido. Em vez de vasculhar todos os arquivos um por um, decidi procurar arquivos .cr2 no meu disco rígido, evitando uma pasta específica chamada Photogsque eu sei que não os possui porque esses não faziam parte do photorecdespejo de dados.


@EliahKagan, veja os comentários (que continuaram no bate-papo!) Para obter detalhes aqui . Não estou certo se e como editar a questão, aconselhar então, por favor, uma vez que você criou uma resposta tão bonita
Zanna

@ user285884 As edições mais recentes da minha resposta incluem um procedimento detalhado para criar uma árvore de links simbólicos para apenas arquivos .cr2, que podem ser abertos no Shotwell (e em alguns outros métodos). Isso deve superar o problema de ver arquivos extras, não .cr2, na Shotwell, bem como o problema de não ter espaço suficiente no dispositivo de destino para mover ou copiar os arquivos. Eu não tinha certeza, no bate-papo relevante , se você já resolveu isso.
Eliah Kagan

Respostas:


6

Normalmente, você deseja apenas abrir o Shotwell e arrastar a pasta.

Se necessário, você pode fazer com que o shell crie uma lista de arquivos CR2 e diga à Shotwell para abrir apenas esses arquivos. Ocasionalmente, pode ser o que você deseja, mas, neste caso , não fez exatamente o que você precisava devido ao comportamento de Shotwell - em algumas outras circunstâncias, um recurso - de mostrar automaticamente outros arquivos de imagem (de todos os tipos) residentes no mesmas pastas que as imagens que você abriu.

Para garantir que o Shotwell tenha conhecimento apenas das imagens em que você está interessado, você pode clonar a árvore de diretórios em outro lugar, copiando apenas os .cr2arquivos e as pastas que os contêm, mas nada mais. Isso pode ocupar espaço adicional substancial, no entanto. Portanto, outra abordagem é construir uma hierarquia de links simbólicos - onde, em vez de ter uma nova árvore de diretórios de cópias dos.cr2 arquivos originais , você tem uma nova árvore de diretórios syminks para eles. Isso ocupa muito menos espaço.

Esta resposta cobre todas essas abordagens.

Abrindo uma pasta de imagens (incluindo subpastas) no Shotwell

O próprio Shotwell oferece duas maneiras de abrir uma árvore de diretórios inteira de fotos. Se isso funcionar para você, você não precisará fazer nada inteligente na linha de comando ou nem mesmo usá-lo. Caso contrário, você pode acabar fazendo isso em conexão com outra técnica. (Por exemplo, se você acabar criando um novo diretório de links simbólicos ou cópias de seus .cr2arquivos, poderá usar uma destas maneiras para abri-lo.)

Caminho 1: Basta abrir a pasta inteira no Shotwell.

Em Shotwell, no menu Arquivo , clique em Importar da pasta . Em seguida, selecione a pasta da qual deseja importar imagens. Isso não se limitará a .cr2arquivos, mas se você estiver abrindo arquivos de várias subpastas contendo .cr2imagens criadas a partir de uma câmera digital, provavelmente esses serão os únicos arquivos presentes.

Captura de tela do item de menu Importar da pasta no menu Arquivo do Shotwell.

Consulte a resposta de Jakob para Mostrar todas as imagens recursivamente (inclua qualquer subpasta) para obter mais informações.

Caminho 2: Arraste a pasta para Shotwell.

Na maioria dos ambientes de desktop e navegadores de arquivos, você também pode abrir o Shotwell e arrastar a pasta que contém suas imagens para a janela do Shotwell. Como Importar da Pasta , essa é outra maneira pela qual a Shotwell recomenda abrir fotos.

Captura de tela de mim arrastando minha pasta Desktop para Shotwell para importar as imagens que ela contém.

Ao arrastar de uma janela do navegador de arquivos ou da área de trabalho para o Shotwell, você pode arrastar para uma biblioteca específica. Ou, se você não possui várias bibliotecas configuradas, basta arrastar basicamente para qualquer lugar e ele funciona. (Você nem precisa arrastar para o painel esquerdo.)

Esse método é muito conveniente e é tão poderoso quanto selecionar manualmente a pasta (em Arquivo > Importar da pasta , conforme descrito acima). Quando você abre arquivos ou pastas usando um desses métodos , o Shotwell oferece a opção de abrir as fotos sem copiá-las em sua biblioteca.

Captura de tela da caixa de diálogo no Shotwell que solicita ao usuário que escolha entre copiar imagens para o local da sua biblioteca do Shotwell ou importá-las no local, sem nenhuma cópia.

Para importar sem copiar, clique em Importar no local em vez de Copiar fotos .


Iniciando o Shotwell com uma lista de nomes de arquivos de imagem

Se, por algum motivo, você quiser ou precisar fazer isso executando um comando no Terminal, poderá executar o shotwellcomando e passar o nome do arquivo de cada imagem para ele como argumento. A Globstar facilita:

shopt -s globstar
shotwell **/*.cr2

Isso abre os .cr2arquivos localizados em qualquer lugar do diretório atual. É diferente de executar o Shotwell e, em seguida, arrastar a pasta, pois o Shotwell tentará apenas importar os arquivos cujos nomes você deu. No entanto, como o Shotwell geralmente mostra outros arquivos de imagem das mesmas pastas que os arquivos que você pediu para abrir, isso pode não ser adequado às suas necessidades. (E mais informações que você forneceu sobre o seu problema sugerem que não está . Veja abaixo uma alternativa.)

Isso não inclui arquivos ou subpastas cujos nomes começam com. . No entanto, se você tiver arquivos CR2 cujos nomes começam com um ponto, na maioria das vezes você provavelmente não deseja abri-los no Shotwell. A menos que você tenha deliberadamente nomeado seus arquivos ou pastas dessa maneira, é mais provável que um arquivo de ponto com uma extensão de nome de arquivo de imagem ou documento seja um arquivo de metadados em vez de uma imagem ou documento real. Por exemplo, o macOS geralmente adiciona esses arquivos (por exemplo, ._kittens.cr2para uma imagem real kittens.cr2) ao acessar mídia externa (incluindo unidades flash e câmeras digitais).

Se você também deseja encontrar arquivos cujos nomes começam com .ou que estão em pastas cujos nomes começam com. , ative também o dotglob. Você pode fazer isso com shopt -s dotglobou passando ambos globstare dotglobpara o shoptbuiltin:

shopt -s globstar dotglob

Por padrão, os globs diferenciam maiúsculas de minúsculas. Mas você pode querer para coincidir com nomes caso insensível , de modo a abrir arquivos que terminam em .cr2, .Cr2, .cR2, e .CR2. Para fazer isso, qualquer um:

  • Ative o nocaseglob executando shopt -scom nocaseglob, sozinho ou com outras opções de shell. Por exemplo, para executar shotwellem todos os .cr2arquivos, pesquisando sem distinção entre maiúsculas e minúsculas e incluindo .-files e arquivos em .-directories:

    shopt -s globstar dotglob nocaseglob
    shotwell **/*.cr2
    
  • Ou use em .[cC][rR]2vez de .cr2no seu próprio padrão glob. Por exemplo, isso realiza o mesmo que acima:

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

    Observe que a distinção entre maiúsculas e minúsculas é totalmente separada da correspondência ou não de .arquivos e pastas. Você pode remover dotglobdos exemplos acima e eles ainda podem fazer distinção entre maiúsculas e minúsculas.

Para especificar um diretório, em vez de apenas usar o diretório atual, coloque seu nome e a /antes da **/*.cr2glob. Por exemplo, substituir o shotwellcomando acima por este abrirá todos os .cr2arquivos dentro do Picturessubdiretório do diretório inicial:

shotwell ~/Pictures/**/*.cr2

Ao contrário do primeiro comando que usa seu diretório atual, não importa onde você execute esse comando, você estará dizendo à Shotwell para abrir os mesmos arquivos.

Teste

Se você realmente precisa usar o terminal para isso, acho que pode fazer parte de algo mais complexo. Se desejar, você pode testar esses comandos antes de executá-los, substituindo-os shotwellpor printf '%s\n'. Em vez de passar os nomes de arquivos para Shotwell, os lista um por linha. Por exemplo, na minha máquina:

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

Desativando o Globstar e outras opções de shell

A opção shell do globstar foi ativada para funcionar, que foi o que o shopt -s globstarcomando (acima) fez. Se já estiver ativado, não será necessário vários comandos. E você só precisa definir o globstar uma vez por instância do shell.

Você pode desativar o globstar executando:

shopt -u globstar

E você pode verificar se a globstar está ativada ou desativada executando:

shopt globstar

Se você estiver usando o globstar em um script, considere desativá-lo novamente, se houver um código que vem depois no mesmo script que não foi escrito com o globstar em mente. Por exemplo, escrever **quando você quer dizer *geralmente não é um problema quando o globstar está desativado, mas com o globstar ativado, pode causar sérios problemas ao fazer um comando afetar muito mais arquivos do que alguém pretendia.

Da mesma forma, se você usou dotglob ou nocaseglob e deseja desativá-los, pode fazê-lo com shopt -u dotglobe shopt -u nocaseglob, respectivamente. Você também pode passar várias opções de shell shopt -upara desmarcá-las ao mesmo tempo. Por exemplo, para desativar globstar, dotglobe nocaseglob:

shopt -u globstar dotglob nocaseglob

Comparado à globstar, há menos erros sérios que você pode cometer, porque se esqueceu de deixar o dotglob ou nocaseglob ativado. Mas outras pessoas (incluindo pessoas que você consulta em sites como o Ask Ubuntu) geralmente assumem que o dotglob e o nocaseglob estão desativados quando sugerem comandos para você usar, a menos que você diga o contrário.

Para obter mais informações sobre essas opções de shell relacionadas ao glob (e também sobre globs em geral ), consulte o manual de referência do bash . Todos são abordados principalmente no 4.3.2 The Shopt Builtin . Para globstar, consulte também 3.5.8.1 Correspondência de padrões . Para dotglob, consulte também 3.5.8 Expansão do nome do arquivo .


Criando uma nova árvore de diretórios

Como no seu caso, você realmente precisa que o Shotwell mostre apenas .cr2 arquivos, não possui .cr2arquivos nas mesmas pastas que os .cr2arquivos, e a navegação por imagens no Shotwell também oferece esses arquivos automaticamente , parece que você precisará de uma pasta que não contém outros arquivos de imagem além dos que .cr2você está tentando abrir.

Mover os arquivos, como você sugeriu , é uma abordagem, mas eu recomendo copiar os arquivos ou, melhor, criar links simbólicos para os arquivos (consulte também FOLDOC ), porque:

  • Se você estiver movendo os arquivos entre dispositivos, isso exige cópia de qualquer maneira, portanto, nesse caso, a movimentação não é mais rápida.
  • Se você tiver espaço, geralmente é uma boa ideia manter uma pasta não modificada de tudo o que você começou, até que você esteja satisfeito com o fato de que o que você fez está correto de acordo com suas necessidades. Obviamente, isso nem sempre é aplicável ou prático. Mas no seu caso, esses arquivos são o resultado de uma operação de recuperação de dados. Pode ser útil manter um registro fácil de ler exatamente o que foi recuperado e de onde.
  • Se você optar por criar links simbólicos, a quantidade de espaço adicional consumido será extremamente pequena . (Se o disco de destino estiver completamente cheio , você ainda precisará liberar espaço nele - ou usar um disco de destino diferente - para criar links simbólicos.)

Também há outra decisão a ser tomada. Você cria todas as novas entradas (sejam cópias ou links simbólicos) no mesmo diretório, nivelando a hierarquia de arquivos? Ou você cria diretórios no destino correspondente a cada um dos diretórios na origem que contêm pelo menos um .cr2arquivo?

  • Achatar a hierarquia de arquivos permite que você veja todos os arquivos de uma só vez, facilmente. Em particular, é fácil ver os nomes e tamanhos dos arquivos de uma só vez, bem como selecionar qualquer combinação dos arquivos em um navegador de arquivos gráfico.

  • Mas também perde informações sobre em quais pastas elas estavam, o que pode ser valioso (embora você possa retornar à pasta original e procurá-las lá se não mover os arquivos).

  • O maior problema com o nivelamento da hierarquia de arquivos, porém, é o que acontece se você tiver dois ou mais arquivos com o mesmo nome em locais diferentes . Se você nivelar a hierarquia do arquivo, dependendo de como você o fizer, todos, exceto o primeiro, não serão copiados (ou vinculados) e você receberá um erro ou aviso, ou todos, exceto a última cópia (ou link) ser substituído .

    Esse é outro motivo pelo qual recomendo copiar ou criar links simbólicos, em vez de mover arquivos. Se você "mover" com êxito vários arquivos para o mesmo arquivo, perderá todos, exceto o último!

Devido às desvantagens de achatar tudo em um único diretório sem subdiretórios, as abordagens adotadas aqui criam uma nova árvore de diretórios no destino.

Caminho 1: Copiando

Mostro isso primeiro porque é um pouco mais simples, mas sugiro que você crie links simbólicos ("Caminho 2"), especialmente se a unidade de destino não tiver espaço suficiente para armazenar todos os arquivos. O "Caminho 2", que é um pouco mais complicado, é muito mais detalhado, porque parece haver menos recursos sobre como usar essa técnica, é o que eu espero que a maioria das pessoas nessa situação prefira e as informações que se aplicam aos dois métodos - conselhos básicos sobre como escapar de espaços nos caminhos - são dados lá e não aqui.

Quando você precisa copiar uma árvore de diretórios e personalizar a operação de cópia, geralmente deve usar em rsyncvez de cp. Este é um daqueles casos.

Substituindo srcpelo caminho para o diretório de nível superior que contém todos os seus arquivos CR2 e substituindo destpelo nome do diretório que você deseja criar que conterá uma hierarquia de links simbólicos para os arquivos CR2, execute:

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

Não esqueça o /depois do nome do diretório de origem, a menos que você queira criar um diretório de nível superior adicionaldest . Ou seja, se você omitir a trilha /, rsynccriará o diretório de destino para você, dentro dest. Por exemplo, suponha que srcseja um caminho relativo que não contém /. Então:

  • Com src/seu rsynccomando, você obtém um link simbólico dest/foo/bar.cr2para o arquivo src/foo/bar.cr2.
  • Com srcseu rsynccomando, você obtém um link simbólico para o arquivo .dest/src/foo/bar.cr2src/foo/bar.cr2

Como pode ser confuso para o diretório de nível superior, onde os links simbólicos serão colocados com o mesmo nome que o diretório de nível superior que contém os .cr2arquivos para os quais os links simbólicos apontarão, eu recomendo que você inclua /no final do destino nome do diretório em seu rsynccomando. (E, para o diretório de origem, atribua a ele um diretório que esteja vazio, que não exista ou que seja dedicado a esse propósito. Caso contrário, você estará bagunçando alguma outra pasta.)

Como é geralmente o caso quando você passar o nome de um arquivo ou diretório para um programa de linha de comando ou script, se o seu destino ou origem os caminhos de diretório conter espaços em branco (ou caracteres tratados especialmente pelo shell, como \, $, ', e vários outra pontuação), então você terá que citá-las . Eu detalhei como fazer isso, no caso mais comum de espaços, no "Caminho 2" - os conselhos sobre citações nessa seção se aplicam aqui também. No entanto, se você não tiver certeza de como citar o nome de uma pasta, pode fazer com que o Ubuntu faça isso simplesmente arrastando a pasta para o Temrminal; seu caminho completo será colado com a cotação correta .

Depois de copiar apenas os .cr2arquivos e as pastas que os contêm, você pode abrir a pasta de destino em Shotwell. (Consulte "Abrindo uma pasta de imagens (incluindo subpastas) no Shotwell" acima.) No entanto, antes de executar rsync, recomendo que você decida se deseja pular as entradas que começam com .e se deseja incluir entradas com sufixos de variante de maiúsculas e minúsculas. Nesse caso, você terá que executar algum rsynccomando ligeiramente diferente .

Personalizando o manuseio de entradas pontilhadas e a distinção entre maiúsculas e minúsculas

Você pode usar um rsynccomando diferente para alterar se os arquivos e diretórios que começam com um ponto são ignorados e se deseja ou não a distinção entre maiúsculas e minúsculas na correspondência do sufixo .cr2.

O comando acima faz incluir diretórios e arquivos cujos nomes começam com .. Para excluir esses arquivos e diretórios, colocar --exclude='.*/' --exclude='.*'antes de todas as outras --includes e --excludes. Ou seja, use este rsynccomando (com as substituições apropriadas srce dest, é claro):

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

Os rsynccomandos mostrados até agora têm sido maiúsculas de minúsculas e não copiar os arquivos que terminam em .CR2, .Cr2ou .cR2em vez de .cr2. Se você deseja que esses arquivos sejam copiados, será necessário contabilizar isso usando o --includepadrão *.[cC][rR]2no lugar de *.cr2.

Este terceiro comando não diferencia maiúsculas de minúsculas e (como o primeiro comando) não ignora arquivos e diretórios cujos nomes começam com .:

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

Se você adota a abordagem de copiar arquivos rsynce não tem certeza de qual desses comandos deseja, sugiro usá- lo se quiser não perder nada. No entanto, você deve estar ciente de que os arquivos de ponto podem conter metadados, e os arquivos de ponto nomeados como imagens podem não ser realmente imagens. Veja as discussões sobre os arquivos de pontos na seção "Iniciando o Shotwell com uma lista de nomes de arquivos de imagem" acima e sobre os arquivos de pontos e a distinção entre maiúsculas e minúsculas no "Caminho 2" abaixo.

Este quarto comando é case-insensitive e (como o segundo comando) faz arquivos, pule e diretórios cujos nomes começam com .:

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

Caminho 2: Criando links simbólicos

É isso que eu recomendo que você faça, embora o Caminho 1 seja bom se você tiver espaço suficiente na unidade de destino. Você não precisa ler o Caminho 1 para usar isso.

O método apresentado aqui faz uma lista de .cr2arquivos e percorre a lista, criando diretórios de destino conforme necessário e preenchendo-os com links simbólicos para cada .cr2arquivo.

Isso é complicado o suficiente para sugerir colocá-lo em um script, em vez de digitá-lo interativamente. Você pode colocar o script onde quiser, mas por conveniência, mostrarei como fazê-lo com o script colocado diretamente na sua pasta pessoal.

Escreva (ou cole) o script.

Crie um arquivo de texto,, make-symlinksna sua pasta pessoal. Nenhuma extensão de arquivo é necessária.

Você pode fazer isso com qualquer editor de texto, como Vim, Nano, Gedit ou Leafpad. Não use um processador de texto como o LibreOffice Writer. (Você pode fazê-lo executando cat > ~/make-symlinks, colando o conteúdo do arquivo e pressionando Ctrl+ Dem uma nova linha, se desejar.)

Se você nomear o script como algo diferente make-symlinks, certifique-se de usá-lo ao executar comandos que usam o script posteriormente.

#!/bin/bash

shopt -s globstar dotglob nocaseglob

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

Coloque isso no arquivo e salve o arquivo. Este script usa globstar, um recurso do Bash explicado acima em "Iniciando o Shotwell com uma lista de nomes de arquivos de imagem" .

Você pode alterar como ele lida com entradas pontilhadas e com distinção entre maiúsculas e minúsculas.

Dependendo das suas necessidades, convém fazer algumas alterações:

  • Se você não deseja incluir .cr2arquivos cujos nomes começam com .ou que residem em diretórios cujos nomes começam com ., remova dotglobda shoptlinha.

    Arquivos e diretórios cujo nome começa com .frequentemente são usados ​​para metadados (consulte a seção "Iniciando o Shotwell com uma lista de nomes de arquivos de imagem" acima). Por outro lado, se você quiser ter tudo, ou se houver algo inexplicavelmente faltando que você tem certeza de que existe, mantenha-o dotglob.

  • Se você quiser incluir apenas os arquivos que terminam em exatamente .cr2, mas não variantes de casos ( .CR2, .Cr2e .cR2), então você deve remover nocaseglob. Como a sua situação envolve recuperação de dados e o Shotwell não mostrará nenhum dos arquivos que você perdeu ao abrir o diretório de links simbólicos - esse é o objetivo desse método, afinal - você provavelmente desejará manter nocaseglob.

Torne executável.

Execute este comando para marcar seu script como executável:

chmod +x ~/make-symlinks

Execute-o na fonte e passe o destino como argumento.

Em seguida, mude o diretório para o diretório de origem, ou seja, a pasta de nível superior que contém as imagens. Por exemplo, se eles estiverem no Picturessubdiretório do diretório inicial, você executaria:

cd ~/Pictures

É aqui que você executa o script. Passe o diretório de destino para o script como um argumento da linha de comandos.

Por exemplo, se você deseja que um diretório chamado cr2sseja criado na área de trabalho para conter os links simbólicos, execute:

~/make-symlinks ~/Desktop/cr2s

Ou se você deseja apenas esse diretório diretamente na sua pasta pessoal:

~/make-symlinks ~/cr2s

Ou se você possui uma unidade montada /media/you/MyDrivee deseja criar uma pasta nela chamada linkspara conter os links simbólicos:

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

Mas se a unidade estiver /media/you/My Drive(com um espaço), você deverá usar a cotação. Qualquer um desses trabalhos (use apenas um, não execute todos):

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

Mas se você usar ~para o seu diretório pessoal, não cite isso:

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

make-symlinkscria o diretório de destino para você, se ele ainda não existir, assim como cria subdiretórios dentro dele. No entanto, ele ainda funciona se o destino já existir.

Você pode até executá-lo várias vezes e transmitir o mesmo diretório de destino (por exemplo, se você o interrompeu com Ctrl+ C), apesar de obter failed to create symbolic linkerros nos links simbólicos que já existem e que podem ser confusos.

Você provavelmente não deseja passar o nome de um diretório que já existe e contém arquivos não relacionados (como o diretório inicial) make-symlinks. Se você o fizer, pode esperar que um monte de links simbólicos e subpastas sejam criados nele. Você provavelmente deseja usar um novo diretório - ou um que ainda não exista - para make-symlinks.

Importe a árvore de link simbólico recém-criada para o Shotwell.

Depois de executar make-symlinks, basta importar o diretório que você passou para o Shotwell, usando um dos métodos fornecidos na primeira parte desta resposta ( "Abrindo uma pasta de imagens (incluindo subpastas) no Shotwell" ). Por exemplo, você pode abrir o Shotwell e arrastar a pasta.

Como todas as entradas na pasta são links simbólicos para .cr2arquivos ou diretórios que os contêm, sem outros tipos de arquivos, o Shotwell não deve ver nenhum dos outros arquivos.


5

O Shotwell percorrerá todas as imagens encontradas em todos os diretórios em que uma imagem está aberta; portanto, usar find -name '*.cr2' -exec shotwell '{}' +como sugeri originalmente não ajuda. Como as configurações do Shotwell são bastante limitadas, a única maneira de pensar em abrir apenas os arquivos que você deseja é movê-los para um novo diretório.

Você pode usar findpara isso:

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

Substitua cppor mvse desejar evitar a criação de arquivos duplicados.

Notas:

  • mkdir ~/cr2files crie um novo diretório em seu diretório pessoal
  • find procure recursivamente do diretório atual para baixo na árvore
  • -type f procure apenas arquivos
  • -iname procure arquivos por nome, ignorando maiúsculas e minúsculas
  • '*.cr2'nomes que terminam com .cr2- use aspas para parar o shell de expandir a glob antes de passar parafind
  • -not -path './dir/*'excluirá o conteúdo do diretório dirdos resultados
  • {} representa os caminhos dos arquivos encontrados
  • --depois cpé dizer para cpnão aceitar mais opções, o que evita os nomes de arquivos que começam com -problemas

Você pode abrir qualquer arquivo no novo diretório com o Shotwell e percorrer todos eles


por que isso também abre arquivos .jpg e .png no diretório? Vejo que ele especifica * .cr2? Como faço para ver apenas arquivos .cr2 quando pressiono a seta esquerda no shotwell? Se eu usar um \ em vez de um +, nada acontece :(
user285884

ah! este é um problema @ user285884 Sinto muito, Shotwell ciclos através de todas as imagens que encontra no diretório ... deixe-me ver se eu consigo descobrir uma maneira de contornar isso ...
Zanna

@ user285884 editado, mas eu não posso trabalhar para fora uma solução elegante :(
Zanna

11
ok, obrigado pelo esforço! e quanto a isso, eu pesquiso no diretório arquivos .cr2 e os movo para uma pasta separada, chamada cr2files. Eu fiz isso em uma subpasta usando mv * .cr2 ../cr2files/ e funcionou! No entanto, como faço para especificar quais arquivos procurar? Algo como "ei linux, veja as pastas 1-10 para arquivos .cr2 e mova-as para a pasta cr2files"? Obrigado Zanna
user285884

11
bem para algum contexto sobre onde estou. Perdi algumas fotos. Então eu fiz um photorec e isso me deu um monte de pastas, o suficiente para encher meu disco rígido inteiro. Então, eu quero procurar em todas as pastas do meu disco rígido, exceto uma, porque essa possui uma tonelada de arquivos .cr2 que eu sei que não são os que estou procurando. Então, eu quero que o Linux passe por todas as pastas, exceto uma. Não sei se o seu código faz isso. O que faz? Também o "-" após o -v? Obrigado Zanna!
precisa saber é o seguinte

1

Opção 1 - Usando xargsquando os nomes de arquivos contêm espaços

Como os comentários abaixo apontaram, o uso back ticks(Opção 3 abaixo) será interrompido quando os nomes de arquivos contiverem espaços. O método mais seguro de usar o findcomando e passar a saída para shotwellusar a xargsopção é semelhante a este:

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

O -print0sinalizador informa ao find para usar \0delimitadores (caracteres nulos) entre os nomes de arquivos e o -0sinalizador informa xargspara esperar esses \0delimitadores.

Reconheça as excelentes respostas encontradas aqui ( Como canalizar a lista de arquivos retornados pelo comando find ) no Stack Overflow.

Opção 2 - Usar -execquando os nomes de arquivos contêm espaços

Como um comentário abaixo aponta, a -execopção também suporta nomes de arquivos que contêm espaços. Outros comentários abaixo apontam que isso é interrompido quando o número de arquivos excede Isso seria assim:

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

Opção 3 - Quando os nomes de arquivos não têm espaços

Antigamente, antes dos nomes dos arquivos terem espaços e se tornarem 256 caracteres, essa opção funcionava bem. Você encontrará essa opção mencionada em muitos outros sites, mas não deve usá-la . No findpassado , usar o comando e passar a saída para shotwellera o método mais simples:

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

Isso inicia o finddiretório atual e inclui todos os subdiretórios:

  • Observe o uso de back ticke não aspas simples 'acima. O uso de back-ticks é semelhante a incluir a frase $(...)dentro do bash.
  • O primeiro argumento .fornece findum ponto de partida, que é o diretório atual. Você poderia passar /home/$USER/Picturesou algo mais em vez de ..
  • O segundo argumento -namediz ao find para procurar nomes de arquivos (não diretórios).
  • Essa técnica funciona para todos os comandos, não apenas shotwell. ou seja, você pode usá-lo para cat, head, taile a maioria dos outros comandos populares de Linux.

Usar os backticks é meio que desaprovado, além de ter problemas com a divisão de palavras. Eu recomendo que você mude para pipe xargs e use -0todos os nomes de arquivo use string NULL como separador #
Sergiy Kolodyazhnyy

O problema com a abordagem nesta resposta é que ele faz a coisa errada quando qualquer um dos nomes de arquivos ou nomes de diretórios que contêm os arquivos possui espaços. Observe que, embora muitas pessoas prefiram a $( )sintaxe de substituição de comando à sintaxe de substituição de comando backtick, isso não é relevante para esse problema - ambas falham exatamente da mesma maneira. @Erg Sugiro postar uma nova resposta sobre como fazê-lo xargs. (Colocar a substituição em " "também não iria funcionar: todos os findresultados seriam passados como um único argumento.)
Elias Kagan

Também vi a xargsopção Stack Overflowao escrever esta resposta. Também vou expandir com essa opção. Infelizmente, tive que inicializar com o Windows 8 hoje de manhã para corrigir a NTFSpartição corrompida, de modo que o teste era problemático. Vou atualizar a resposta mais tarde. Obrigado por apontar isso :)
WinEunuuchs2Unix

por que não usar -exec?
Zanna

@Zanna eu vou adicionar a -execopção também :)
WinEunuuchs2Unix

-2

Eu não sabia que o Shotwell nem abriu arquivos brutos. Estou certo de que você pode obter mais milhas com o digikam ou o darktable. O Digikam vem com alguns componentes do Kde e é um bom gerenciador de fotos. O Darktable vem com muito bons recursos de edição não destrutiva.


Você pode expandir esta resposta ( editando ) para incluir informações detalhadas sobre como usar o Digikam (ou Darktable) para navegar apenas pelos .cr2arquivos de uma pasta? Nesse caso, isso pode ser valioso, pois o pôster original teve problemas para fazer com que Shotwell mostrasse apenas os .cr2arquivos. Embora tenha adicionado abordagens adicionais à minha resposta para possibilitar o uso do Shotwell para navegar apenas por esses arquivos e por outros, desconfio bastante que o Shotwell não seja a melhor ferramenta para isso.
Elias Kagan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.