Encontre todos os nomes de arquivos.ext1 onde não existe nome de arquivo.ext2 no OS X ou no shell

5

Eu preciso criar as versões TIF e JPG de um grande conjunto de imagens.

Todas as imagens JPG já existem, mas apenas uma parte das imagens TIF. Existe uma maneira fácil de pesquisar um diretório para encontrar todos os arquivos JPG que não têm nenhum arquivo TIF correspondente (por exemplo, um arquivo com o mesmo nome, mas com extensão de arquivo diferente)?

    
por Anders Svensson 10.10.2011 / 17:00

6 respostas

3

One-liner Perl:

find . -name '*.jpg'|perl -nle 's/\.jpg//;unless(-f "$_.tif"){print "$_.jpg"}' 

Em 63 caracteres:

find . -name '*.jpg'|perl -pnle 's/.jpg//;-f "$_.tif"||"$_.jpg"' 
    
por 10.10.2011 / 23:12
7

Supondo que todas as imagens estejam no diretório images e possua o sufixo .jpg , o script a seguir imprimirá todos os arquivos de imagem que não tiverem arquivo .tif correspondente no UNIX:

#!/bin/sh

find images/ -type f -name "*.jpg" |
while read j; do
  t=${j%.jpg}.tif
  if [ ! -f "$t" ]; then
    echo "Lacking tif file: " $j
  fi
done

Cole-o em um arquivo e salve-o em uma pasta acima daquela em que suas imagens estão armazenadas. Você poderia chamá-lo de find-images . Por exemplo:

├── find-images
└── images/
    ├── 1.jpg
    └── 2.jpg
    └── ...

Agora, abra Utilities / Terminal.app e use o comando cd para navegar até a pasta em que seu script está, por exemplo, Se o script estiver na sua área de trabalho, basta digitar cd Desktop .

Em seguida, insira chmod +x find-images . Agora você pode executar o script apenas chamando ./find-images .

    
por 10.10.2011 / 17:47
6

Eu vou usar Python, já que é multi-plataforma. Primeiro, coloque seus arquivos jpg e tif em pastas separadas.

import os

jpgPath = "path/to/jpgs/folder"
tifPath = "path/to/tifs/folder"

jpgList = [item.rsplit(".", 1)[0] for item in os.listdir(jpgPath)]
tifList = [item.rsplit(".", 1)[0] for item in os.listdir(tifPath)]

diffList = [item for item in jpgList if item not in tifList]

print diffList

Em seguida, salve esse script em um arquivo, em algum lugar no disco rígido, talvez sob o nome find-images .

Agora, abra Utilities / Terminal.app e digite python /path/to/file . Por exemplo, se você salvou na sua área de trabalho, seria python ~/Desktop/find-images (pois ~ é um atalho para sua pasta pessoal). Aqui, você pode executar uma explicação mais detalhada sobre a execução de arquivos Python no seu Mac.

    
por 10.10.2011 / 17:55
2

Ah, eu senti vontade de adicionar isso. Aqui está a solução em Ruby, que imprime todas as imagens que não têm contraparte TIF:

jpg = Dir["*.jpg"]
tif = Dir["*.tif"]    
[jpg, tif].each { |a| a.map!{ |f| f[0..-5]} }
puts jpg - tif

Coloque-o em um arquivo que resida na mesma pasta das imagens, salve-o como find-images e execute-o no Terminal inserindo ruby find-images .

Se você não conhece o Ruby, não pergunte como funciona, pode demorar um pouco para explicar: P

    
por 10.10.2011 / 20:25
2

diffext

#!/bin/bash

found1=$(find "$PWD" -name "*.$1")
found2=$(find "$PWD" -name "*.$2")
export IFS=$'\n'
for f1 in "$found1"; do
    base1=${f1##/}
    for f2 in "$found2"; do
        base2=${f2##/}
        [[ ${base1%.$1} == ${base2%.$2} ]] && continue 2
    done
    echo "$f1"
done
  • Uso: cd somedir; diffext jpg tif
  • Procura recursivamente em subdiretórios do diretório atual
    • Trata os arquivos como duplicados, mesmo se eles estivessem em diretórios diferentes
por 11.10.2011 / 11:12
1

Um-liner (s) sem perl:

Com o uso de loop while após a localização:

find . -name '*.jpg' | while read file ; do test ! -f 'dirname $file'/'basename $file .jpg'.tif && echo $file; done

Com o uso de (muitas) subpastas:

find . -name '*.jpg' -exec sh -c 'test ! -f 'echo {} |sed s/\.jpg$/.flac/' && echo {}' \;
    
por 27.10.2011 / 19:33