Como excluir arquivos brutos "não utilizados" que não têm correspondência .jpg?


10

Eu tiro RAW + JPG, ou seja, NEF e JPG. Depois de visualizar algumas vezes centenas de imagens (usando um programa simples) e excluir os JPGs, tenho muitos arquivos NEF restantes desnecessários. Se houvesse um script para excluir arquivos NEF órfãos no diretório, isso seria muito útil. Li uma pergunta semelhante aqui " Como excluir arquivos JPG, mas apenas se o arquivo RAW correspondente existir? " E a solução apresentada com o prompt de comando funciona muito bem. Fiquei me perguntando se um estava disponível para a minha situação?


Você pode fornecer um link para essa pergunta aqui? A resposta para isso quase certamente será um script de shell - talvez pergunte no SuperUser, porque se você tem uma boa definição do que precisa excluir (por nome do arquivo), essa é uma tarefa bastante trivial.
— Ben Parsons

11
Para o futuro, basta usar o Geeqie. Ele exclui os arquivos RAW correspondentes automaticamente e qualquer outro que seja definido como um arquivo 'sidecar' com base na configuração.
— Itai

Tenho minha configuração da seguinte maneira: NEF: \\ Photos \ RAW \ YYYY \ AAAA-MM-DD \ original.nef Jpegs: \\ Photos \ RAW \ YYYY \ YYYY-MM-DD \ original.jpeg De qualquer forma, posso aplicar isso script para isso?

No Bash: órfão = .nef; pai = .jpeg; para f em * "$ órfão"; do F = "$ {f% $ órfão} $ pai"; se teste! -f "$ F"; em seguida, ecoa "Órfão identificado: $ f existe, mas não $ F"; Não é possível acreditar em quão longas e complicadas essas outras respostas são. Sim, eu sei, respondendo no comentário, mas é protegida ...
— Ninguém

Respostas:


9

Eu escrevi um script em Python para fazer o trabalho para mim. É chamado remove-orphaned-raw-images.pye publiquei no Github .

Basicamente, ele itera sobre todos os arquivos em uma determinada pasta e move imagens brutas órfãs (no meu caso, *.CR2arquivos sem JPEG correspondente) para uma pasta de backup. Opcionalmente, você pode dizer ao script para realmente excluir os arquivos.

Aqui está um esboço do algoritmo:

  • Obtenha uma lista de todos os arquivos no diretório selecionado.
  • Classifique esses arquivos em arquivos RAW e JPEG (anexe-os a listas separadas).
  • Verifique para cada item na lista de imagens RAW que existe uma correspondência na lista JPEG;
    caso contrário, anexe esta imagem a uma lista de imagens brutas órfãs.
  • Mova as imagens na lista de imagens órfãs para uma pasta de backup
    (ou exclua-as diretamente, se desejado explicitamente).

A ferramenta informará como usá-lo quando executado com a opção de ajuda -hna linha de comando.

Esse problema também me ocorreu, e foi por isso que escrevi essa ferramenta. Estou usando minha DSLR para tirar imagens JPEG ou RAW + JPEG, nunca apenas RAW. Ao classificar fotos borradas ou borradas, uso os JPEGs para examiná-las rapidamente e excluir as ruins. Isso me deixa sobrando imagens RAW das quais excluí os JPEGs correspondentes (por um motivo).


5

Usando a pergunta que você mencionou - escrevi um script para você

ok aviso! tenha cuidado com este script! - FAÇA UM BACKUP

1) Crie um arquivo bat chamado clean.bat e coloque-o no diretório com o qual deseja trabalhar

2) Em seguida, digite o seguinte no arquivo bat

mkdir keep
for /f "delims==" %%r in ('dir /b *.jpg') do move "%%~dpr%%~nr.nef" "%CD%\keep\" 2> nul
move *.jpg "%CD%\keep\"
del *.nef
del *.jpg
move "%CD%\keep\*.*" "%CD%\"
rmdir keep

3) Abra o prompt de comando como administrador e navegue até a pasta com o arquivo clean.bat 4) execute clean.bat

Basicamente, o fluxo do script é

  • Crie um diretório chamado Keep
  • Mova todos os arquivos NEF correspondentes para a pasta keep
  • Mova todos os JPEGs para a pasta Keep
  • Em seguida, exclua todos os arquivos da pasta de origem
  • Mover os arquivos de manutenção novamente
  • Remova a pasta keep

Por favor, teste isso!

UPDATE: Alterou o script para funcionar com pastas que possuem espaços neles


2
+1 para uma solução simples e instantânea! Estou precisando dessa solução há muito tempo. Eu costumava elaborar comandos colando a saída do DIR no Excel e usando operadores complicados como o vlookup para gerar comandos individuais, mas isso captura quase todas as minhas necessidades. Testei o script e está completamente bom para mim. Teve que consultar várias referências para entender completamente o script e poder modificá-lo para outras operações semelhantes.
— 11263

Fantástico, você me salvou horas de trabalho tedioso !!! Eu tentei várias vezes e funciona muito rápido. É exatamente o que eu estava procurando.
— 12114 Al-H

@ al-h - por favor, você pode marcar como correto, então? obrigado #
— 12124 Rob

Rob Não tenho certeza do que você quer dizer com "por favor, marque como correto". Não vejo um lugar em que possa verificar um link correto.
— 27412 Al H

Uma coisa que eu notei. Isso não funciona em pastas na área de trabalho (exclui todos os arquivos jpg e NEF); portanto, teste primeiro. Estou executando o Windows XP Pro.
— Al H

1

Aqui está o meu script python para excluir cr2's w / oa jpeg.

Ele pesquisa recursivamente dentro do diretório atual, ".". Ele considera todas as imagens em todas as pastas.

import os 
import sys

#Searches through the current directory, recursively, looking for any raw
#and jpeg files. It enumerates the jpegs it finds, without the extension, and
#then enumerates the raw files it finds. If it finds a raw file for which no
#jpeg exists, then it deletes the raw file.
#
# This WILL NOT WORK, if there are files with repeated file numbers.
# this will NOT be an issue if there's only one camera. 

# A dict of filename: (rawpath, jpegpath)
files_seen = {}

for (cur_dir, subdirs, files) in os.walk("."):
  for file in files:
    fname, fext = os.path.splitext(file)
    fext = fext.lower()



    if (fext == ".jpg"):
      content = files_seen.setdefault(fname, [None, None])
      # if it is then filenames have du'ped
      assert(content[1] is None)
      content[1] = os.path.join(cur_dir, file)

    elif (fext == ".cr2"):
      content = files_seen.setdefault(fname, [None, None])
      assert(content[0] is None)
      content[0] = os.path.join(cur_dir, file)

#at the end, we look for raw files without a jpeg,

for key in files_seen:
  (raw_path, jpeg_path) = files_seen[key]

  if jpeg_path is None:
    print("Deleting: %s" % raw_path)
    #os.system("pause.exe")    
    os.unlink(raw_path)

print("Done")
os.system("pause.exe")

Apenas renomear ".CR2" para" .nef"
— Peter pete

Não estou familiarizado com o Python, mas vejo que se refere a "pause.exe" na última linha. Isso significa que ele está funcionando apenas no Windows? Eu pensei que o Python fosse independente de plataforma.
— Saaru Lindestøkke 18/03/2013

Gday. O pause.exe eu apenas coloco para que o python thingo não desapareça assim que termina a execução, depois que eu clico duas vezes nele no explorer. Você é livre para remover esta linha e pronto, ela será independente da plataforma. Usar coisas dependentes de SO é uma prática ruim e, como o escrevi inicialmente para mim, fiquei preguiçoso: D Pelo menos não concatenei caminhos com barras ingênuas nem usei funções específicas de excluir arquivos.
— Peter pete

Também foi escrito para as versões do Python 3.x. Se você quer que ele seja 2.x amigável apenas mudar toda a cópia ( "algo") para imprimir "algo"
— Peter pete
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.