5

Мне нужно создать как TIF, так и JPG версии большого набора изображений.

Все изображения JPG уже существуют, но являются только частью изображений TIF. Существует ли простой способ поиска в каталоге, чтобы найти все файлы JPG, которые не имеют соответствующего файла TIF (т.е. файл с тем же именем, но с другим расширением файла)?

6 ответов6

7

Предполагая, что все изображения находятся в каталоге images и имеют суффикс .jpg , следующий небольшой скрипт распечатает все файлы изображений, у которых нет соответствующего файла .tif в 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

Вставьте его в файл и сохраните в папке над той, где хранятся ваши изображения. Вы могли бы назвать это find-images . Например:

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

Теперь откройте Utilities/Terminal.app и с помощью команды cd перейдите в папку, где находится ваш скрипт, например, если скрипт находится на вашем рабочем столе, просто введите cd Desktop .

Затем введите chmod +x find-images . Теперь вы можете запустить скрипт, просто позвонив ./find-images .

6

Я буду использовать Python, так как он кроссплатформенный. Сначала поместите файлы jpg и tif в отдельные папки.

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

Затем сохраните этот скрипт в файл где-нибудь на жестком диске, возможно, под именем find-images .

Теперь откройте Utilities/Terminal.app и введите python /path/to/file . Например, если вы сохранили его на рабочем столе, это будет python ~/Desktop/find-images (поскольку ~ - это ярлык для вашей домашней папки). Здесь вы можете более подробно объяснить, как запускать файлы Python на вашем Mac.

3

Perl однострочный:

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

В 63 символов:

find . -name '*.jpg'|perl -pnle 's/.jpg//;-f "$_.tif"||"$_.jpg"' 
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
  • Использование: cd somedir; diffext jpg tif
  • Поиск рекурсивно в подкаталогах текущего каталога
    • Обрабатывает файлы как дубликаты, даже если они находятся в разных каталогах
2

Ах, я хотел добавить это. Вот решение в Ruby, которое печатает каждое изображение без аналога TIF:

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

Поместите его в файл, который находится в той же папке, что и ваши изображения, сохраните его как find-images и запустите его в Terminal, введя ruby find-images .

Если вы не знаете Ruby, не спрашивайте, как он работает, объяснение может занять некоторое время:P

1

Однострочник без Perl:

С использованием цикла while после find:

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

С использованием (много) подоболочек:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .