Как удалить файлы изображений, которые меньше, чем определенные размеры

Я уже нашел ответ, который перечисляет почти все. За исключением того, что я не могу заставить его работать.

Я использую:

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300{print $3}'

Что нужно для удаления выходных файлов?
Я пытался добавить | rm в конце, но ошибка показывает, что я пропускаю операнд. Я хочу, чтобы все файлы, которые печатает код выше, были удалены.

Может кто-нибудь, пожалуйста, помогите

3 ответа

Решение

Вы должны быть в состоянии использовать rm $(find...$3}'),

Другими словами, оберните вышеуказанную команду в круглые скобки в $(), чтобы использовать результаты в качестве аргумента для rm,

Следующее работает и очень быстро. Сохраните в ~/ verifyize.sh и сделайте его исполняемым с помощью chmod (chmod +x ~/checksize.sh)

#! /bin/bash

#find . -type f -exec bash -c ~/checksize.sh ;
echo ${@}
if [ -z "$1" ]
then
    echo "\$1 empty" >&2
    exit
fi

size=($(identify -format "%w %h" "$1" | tr -d "()"))
#echo ${size[@]}
#echo ${size[0]}
#echo ${size[1]}
if [ ${size[0]} -lt 300 -a ${size[1]} -lt 300 ]
then
    rm -v "$1"
fi

Затем измените каталог на каталог, из которого вы хотите удалить слишком маленькие файлы.

После cd'ing в каталог, выполните следующее: find . -type f | xargs -P 0 -L 1 ~/checksize.sh

Он работает быстро, потому что использует -P 0 XARG, что делает xarg бегите с максимально возможным количеством паралеллитов. Смотрите его справочную страницу для деталей.

rm не читает имена файлов из ввода. Вы, вероятно, можете сделать:

find . -iname "*.jpg" -type f -exec bash -c 'for i; do size=($(identify -format "%w %h" "$i")); (( size[1] < 300 || size[2] < 300 )) && rm -v "$i"' remove-files {} +
  • Ты можешь использовать -exec вместо xargs,

Команда bash:

for i
do
    size=($(identify -format "%w %h" "$i"))
    (( size[1] < 300 || size[2] < 300 )) && rm -v "$i"
done
  • перебирает все входные аргументы (for i)
  • получает размер и сохраняет его в массиве (поэтому вокруг него есть круглые скобки $(): ($(identify -format "%w %h" "$i"))
  • использует арифметику оболочки (( )) сделать сравнение
Другие вопросы по тегам