LINUX.ORG.RU

Написал скрипт

 


0

1

Привет! Возникла у меня потребность почистиь большую папку с изображениями от битых файлов. Вручную это делать долго. Но я обнаружил, что битые .jpg имеют существенно меньший объем чем даже самые низкокачественные целые файлы. И написал скрипт, удаляющий файлы меньше определенного значения.

#! /bin/bash
export IFS=$'\n'

list=`find $1 -name "*jpg" -size -25`
for i in $list
do
rm $i
done 

Покритикуйте :) Может, у кого-нибудь еще есть идеи, как фильтровать битые изображения.

Ответ на: комментарий от exfx

Другой вариант (в какой-то мере более универсальный, тк вместо удаления можно делать что угодно):

find . -type f -iname '*.jpg' -size 25 -print0 | xargs -0 rm
beastie ★★★★★
()
Ответ на: комментарий от anti_win

Прикол :) Вот что называется «костылестроением». Спасибо.

Зато ты теперь знаешь почему некоьорые люди тпк нелюбят systemd.
На systemd если ты чего либо не знаешь то ты просто не можешь нлрмально решить задачу, на других инитах если ты чего либо не знаешь то ты для решения задачи просто пишешь чуть более длинный rc скрипт.

torvn77 ★★★★★
()

Может, у кого-нибудь еще есть идеи, как фильтровать битые изображения.

not-readable-jpeg.sh

#!/bin/sh

find . \( -name '*.jpeg' -or -name '*.jpg' -or -name '*.JPEG' -or -name '*.JPG' \) -exec sh -c \
    'echo -n -e "\033[2K" >&2; \
    echo -n "\r{}" >&2; \
    djpeg -fast "{}" > /dev/null 2>/dev/null || echo "\r{} - bad"; ' \;
echo -n -e "\033[2K" >&2
echo >&2

not-readable-gif.sh

#!/bin/sh

find . -name '*.gif' -exec sh -c \
    'echo -n -e "\033[2K" >&2; \
    echo -n "\r{}" >&2; \
    gifsicle "{}" > /dev/null 2>/dev/null || echo "\r{} - bad"; ' \;
echo -n -e "\033[2K" >&2
echo >&2

not-readable-png.sh

#!/bin/sh

find . -name '*.png' -exec sh -c \
    'echo -n -e "\033[2K" >&2; \
    echo -n "\r{}" >&2; \
    pngtopnm "{}" > /dev/null 2>/dev/null || echo "\r{} - bad"; ' \;
echo -n -e "\033[2K" >&2
echo >&2

not-readable-pics.sh

#!/bin/sh

sh "$(dirname "$0")/not-readable-gif.sh"
sh "$(dirname "$0")/not-readable-jpeg.sh"
sh "$(dirname "$0")/not-readable-png.sh"
i-rinat ★★★★★
()
Ответ на: комментарий от MaxPower

Так ты восстановлением данных занимался? Я читал про восстановление по сигнатурам, но сами сигнатуры же не помню :)

anti_win ★★
() автор топика
Ответ на: комментарий от anti_win

восстановлением данных занимался?

Кстати да. Мож заcatать свои jpeg-и, а потом на это jpeg-recover натравить.

anonymous
()
Ответ на: комментарий от anonymous

Не думаю, что он что-то там увидит Они восстанавливались с отформатированного винта. В HEX-редакторе большая часть файла представлена нулями. Так что не знаю, что там можно восстановить.

anti_win ★★
() автор топика
Ответ на: комментарий от anti_win

Не думаю, что он что-то там увидит

Ты о чём? Попробовал? Не получилось? Ась?

anonymous
()
Ответ на: комментарий от vodz

Ага, всё никак не доходят руки переписать на питоне.

i-rinat ★★★★★
()
Ответ на: комментарий от legolegs

Ну я тоже вроде вам как-то на подобное отвечал, что $0 это куце, так лучше:

find  -print0 | xargs -0 sh -c 'for i; do cmd "$i"; done'

vodz ★★★★★
()
Ответ на: комментарий от anti_win

Так ты восстановлением данных занимался?

Речь же шла про поиск битых файлов. Теперь ты уже хочешь восстанавливать утраченную информацию? Бэкапы ты конечно же не делал, верно?

MaxPower ★★
()
Ответ на: комментарий от MaxPower

Нет, ничего я не собирался восстанавливать. Эти данные я восстановил уже давно. Мне надо было просто навести там порядок. Про поиск битой информации я сразу понял.

anti_win ★★
() автор топика
Ответ на: комментарий от i-rinat

( -name ‘*.jpeg’ -or -name ‘*.jpg’ -or -name ‘*.JPEG’ -or -name ‘*.JPG’ )

а «.Jpg»?

почему бы не \( -iname '*.jpg' -or -iname '*.jpeg' \)?

> /dev/null 2>/dev/null

&> /dev/null

echo -n -e «\033[2K»

На экране то конечно красиво будет, но в коде как-то не очень..

echo -n -e «\033[2K» >&2
echo >&2

Может просто -n убрать?

Tanger ★★★★★
()
Ответ на: комментарий от Tanger

почему бы не

или -iregex

Может просто -n убрать?

Может. Но зачем? Оптимизировать один вызов echo? Там в цикле шелл запускается для каждого файла, и это неслабо так тормозит. Если и заниматься оптимизациями, имеет смысл всё либо на чём-то компилируемом написать, либо хотя бы уменьшить число запускаемых процессов.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

имеет смысл всё либо на чём-то компилируемом написать

Да не имеет. Задача «не та». И не ведись, Ринат, на провокэйшен. Ну захотелось кому то «письками померятся», ну так пусть меряется сам с собой.

anonymous
()
Ответ на: комментарий от anonymous

Они не меряются, а на вполне реальные дефекты указывают. Но мне лень разбираться в шеле, чтобы их чинить. Работает же. Файлов с кавычками у меня ещё не было. И не было достаточно большого числа файлов, чтобы заморочиться переписыванием.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Файлов с кавычками у меня ещё не было.

А какая разница, были или не были? Всегда есть rename. Считаю проблему надуманной.

anonymous
()
Ответ на: комментарий от i-rinat

Может. Но зачем? Оптимизировать один вызов echo?

Скорее упростить код для чтения.

export CLEAR="\033[2K\r"
find . \( -iname '*.jpg' -or -iname '*.jpeg' \) -exec sh -c \
    'echo -n -e "$CLEAR{}" >&2; \
    djpeg -fast "{}" &> /dev/null || echo "\r{} - bad"; ' \;
echo -e "$CLEAR" >&2

Впрочем особо лучше не стало.. :)

или -iregex

-iregex '.*\.jp\(e\|\)g' - весьма страшно получается.

Tanger ★★★★★
()
Ответ на: комментарий от i-rinat

Для однократной задачи, скрипты вполне годятся, ну не хотите -print0 | xargs, есть же и posix-ный -exec +:

find . -exec sh -c 'for i; do cmd "$i"; done' {} \+

vodz ★★★★★
()
Ответ на: комментарий от legolegs

Нужна затычка для $0.

А, сглупил, конечно это работает с пропуском '.' :)

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от legolegs

Тогда printf?

Наверное, но это мелочи, чем с кавычками и $ :)

vodz ★★★★★
()

Ну всё, теперь скрипт вылизан до предела.

i-rinat ★★★★★
()

битые .jpg имеют существенно меньший объем чем даже самые низкокачественные целые файлы

Этому есть какое-то объяснение?

beaver
()
Ответ на: комментарий от anonymous

Это не новый год, это не перечитал пост после набора на смартфоне.

torvn77 ★★★★★
()
Ответ на: комментарий от anti_win

Большая часть содержимого битых файлов — нули.

Да ну нет. Часто битым оказывается один бит, из-за чего весь JPEG корёжит. Откуда там большая часть нулями забъётся?

beaver
()
Ответ на: комментарий от beaver

Не может один бит быть бит, диск же контрольную сумму на каждый физический блок считает, а это сегодня 4кб

legolegs ★★★★★
()
Ответ на: комментарий от beaver

Повторяю, они восстанавливались хрен знает когда с отформатированного винта.

anti_win ★★
() автор топика

Откуда вообще эти битые картинки? Да еще в таком количестве, чтобы их удалять скриптом? Ни разу не сталкивался.

anonymous
()
Ответ на: комментарий от anonymous

У меня там полно фотографий тогда отформатировалось. И восстановилось не только то, что я непосредственно перед этим записал, но и гораздо более древние файлы, которые когда-то были записаны туда, потом их отформатировали и они восстановились вместе с моими.

anti_win ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.