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?

Al H
fonte
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).

pklaus
fonte
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

Roubar
fonte
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")
Peter pete
fonte
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