Как удалить файлы изображений, которые меньше, чем определенные размеры
Я уже нашел ответ, который перечисляет почти все. За исключением того, что я не могу заставить его работать.
Я использую:
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"))
- использует арифметику оболочки
(( ))
сделать сравнение