Скрипт Bin Bash Terminal для изменения размера изображений PNG/CR2/JPG с использованием Mac SIPS с проверкой экономии места
Я сделал небольшой крутой сценарий, чтобы взять мою огромную коллекцию фотографий JPG/PNG/CR2 (необработанные файлы) и преобразовать их в MacBook Pro Retina с разрешением 2880 пикселей в формате JPEG.
Это позволяет мне иметь все мои фотографии на моем компьютере, сохраняя гигантские оригиналы на внешнем жестком диске. Лучше всего картинки выглядят фантастически, потому что они уменьшены до моего точного физического разрешения экрана 2880 пикселей в ширину!
Вы можете легко адаптировать скрипт под свои нужды...
Хорошо, так на мой вопрос....
Мои фотографии на моем внешнем жестком диске хранятся так:
(Корень жесткого диска)
Фотографий
2013-05 Свадьба в Вермонте
IMG_0001.JPG
img_0002.jpg
2014-10 Поездка в Лас-Вегас
img_0001.cr2
img_0002.cr2
...
Сейчас сценарий перезаписывает исходные файлы... поэтому мне всегда нужно сделать полную копию всех моих фотографий на 2-й диск и затем запустить сценарий. Есть ли простой способ заставить скрипт заново создать всю структуру каталогов и записать новые файлы в новую папку / диск, сохраняя при этом структуру каталогов?
СПАСИБО ЗА ВАШУ ПОМОЩЬ!
##################################
#!/bin/bash - resize2880px.sh (It's for Mac OS X computers)
# By Jason Fox of GetFoxy.com 2014 - hit me at jfox {at} foxnv.com if you have questions
# This script converts all PNG/JPG/CR2 files to JPG at a max resolution of 2880px (saving tons of space in the process).
# run it like this:
# 0. Save this script in your Documents Folder as resize2880px.sh
# 1. Open Terminal and CD into the directory of pictures to shrink
# 2. paste in: find . -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.cr2" \) -exec sh ~/Documents/resize2880px.sh {} \;
# 3. If you have the awesome JPEGMini app... use it now to further save space! ;)
#the sizes to convert to
width=2880
height=2880
#theFile given in input
theFile=$1
echo ""
echo "$theFile"
#using sips to retrieve the width & height
#size[0] = width
#size[1] = height
size=($(sips -g pixelWidth -g pixelHeight "$theFile" | grep -o '[0-9]*$'))
if [[ ${size[0]} -le $width && ${size[1]} -le $height ]];
then echo "Width = ${size[0]} & Height = ${size[1]} SO... W<=$width H<=$height - no resize - just JPG convert"
sips -s format jpeg "$theFile" --out "$theFile-t2880px.jpg"
elif [[ ${size[0]} -gt $width && ${size[1]} -le $height ]];
then echo "Width = ${size[0]} & Height = ${size[1]} SO... W>$width H<=$height - Run SIPS $width JPG conversion"
sips -Z 2880 -s format jpeg "$theFile" --out "$theFile-t2880px.jpg"
elif [[ ${size[0]} -le $width && ${size[1]} -gt $height ]];
then echo "Width = ${size[0]} & Height = ${size[1]} SO... W<=$width H>$height - Run SIPS $width JPG conversion"
sips -Z 2880 -s format jpeg "$theFile" --out "$theFile-t2880px.jpg"
elif [[ ${size[0]} -gt $width && ${size[1]} -gt $height ]];
then echo "Width = ${size[0]} & Height = ${size[1]} SO... W>$width H>=$height - Run SIPS $width JPG conversion"
sips -Z 2880 -s format jpeg "$theFile" --out "$theFile-t2880px.jpg"
else echo "Something is wrong."
fi
# Determine number of file system blocks used to store the original and new files
origfilesize=$(ls -s "$theFile" | awk '{print $1}')
newfilesize=$(ls -s "$theFile-t2880px.jpg" | awk '{print $1}')
if [[ $origfilesize -le $newfilesize ]];
then echo "$origfilesize is less than or equal to $newfilesize - no space saved so deleting the new file"
rm "$theFile-t2880px.jpg"
else
echo "$origfilesize is greater than $newfilesize - deleting original file"
rm "$theFile"
fi
2 ответа
Конечно. Либо установите переменную в скрипте вверху, либо передайте новый параметр, который говорит, где должна быть создана новая древовидная структура. Или сделайте смесь, и установите новый корневой каталог по умолчанию, но позвольте пользователю перезаписать его вторым параметром в командной строке следующим образом:
newroot=${2:-~/Desktop/resized}
Тогда используйте dirname
чтобы получить имя каталога, в котором находится каждое входное изображение, например:
dir=$(dirname "/users/bozo/tmp/image.jpg")
это даст вам
/users/bozo/tmp
Теперь поместите новый путь каталога
newpath="$newroot/$dir"
и сделать это, включая все промежуточные папки и игнорируя ошибки с
mkdir -p "$newpath" 2> /dev/null
и измените ваши команды для вывода, как это
file=$(basename "input image path")
sips ... --out "$newpath/$file"
Вот законченный сценарий!:)
##################################
#!/bin/bash - resize2880px.sh (It's for Mac OS X v10.6+ computers - Tested on v10.10 Yosemite)
# By Jason Fox of GetFoxy.com 2014 - hit me at jfox {at} foxnv.com if you have questions
# This script converts all PNG/JPG/CR2 files to JPG at a max resolution of 2880px (saving tons of space).
# run it like this:
# 0. Save this script in your Documents Folder as resize2880px.sh
# 1. Open Terminal and CD into the directory of pictures to shrink
# 2. paste in: find . -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.cr2" \) -exec sh ~/Documents/resize2880px.sh {} \;
# 3. If you have the awesome JPEGMini app... use it to further save space! ;)
#Define the output folder
outputfolder=~/Desktop/2880px
#the sizes to convert to (max pixels)
width=2880
height=2880
theFile=$1
echo ""
dir=$(dirname "$theFile")
newpath=$outputfolder/$dir/
echo $theFile will move to $newpath
mkdir -p "$newpath"
#using sips to retrieve the width & height
#size[0] = width
#size[1] = height
size=($(sips -g pixelWidth -g pixelHeight "$theFile" | grep -o '[0-9]*$'))
if [[ ${size[0]} -le $width && ${size[1]} -le $height ]];
then echo "Width = ${size[0]} & Height = ${size[1]} SO... W<=$width H<=$height - no resize - just JPG convert"
sips -s format jpeg "$theFile" --out "$outputfolder/$theFile-t2880px.jpg"
elif [[ ${size[0]} -gt $width && ${size[1]} -le $height ]];
then echo "Width = ${size[0]} & Height = ${size[1]} SO... W>$width H<=$height - Run SIPS $width JPG conversion"
sips -Z 2880 -s format jpeg "$theFile" --out "$outputfolder/$theFile-t2880px.jpg"
elif [[ ${size[0]} -le $width && ${size[1]} -gt $height ]];
then echo "Width = ${size[0]} & Height = ${size[1]} SO... W<=$width H>$height - Run SIPS $width JPG conversion"
sips -Z 2880 -s format jpeg "$theFile" --out "$outputfolder/$theFile-t2880px.jpg"
elif [[ ${size[0]} -gt $width && ${size[1]} -gt $height ]];
then echo "Width = ${size[0]} & Height = ${size[1]} SO... W>$width H>=$height - Run SIPS $width JPG conversion"
sips -Z 2880 -s format jpeg "$theFile" --out "$outputfolder/$theFile-t2880px.jpg"
else echo "Something is wrong."
fi
# Determine number of file system blocks used to store the original and new files
origfilesize=$(ls -s "$theFile" | awk '{print $1}')
newfilesize=$(ls -s "$outputfolder/$theFile-t2880px.jpg" | awk '{print $1}')
# File Size comparison (make sure we're saving space)
if [[ $origfilesize -lt $newfilesize ]];
then echo "$origfilesize is less than to $newfilesize - delete new file - use original file instead"
rm "$outputfolder/$theFile-t2880px.jpg"
cp "$theFile" "$outputfolder/$theFile"
fi
Спасибо за помощь Марк Сетчелл!