如何递归地将图像从一个文件夹调整到另一个文件夹?

时间:2015-11-17 18:53:42

标签: bash thumbnails

我想将已组织成一组嵌套子目录的图像缩略图创建到文件结构的镜像中,以便输出以下类型的命令:

./imageresize.sh Large Small 10

...会转换嵌套在" ./ Large":

下的目录中的任何.jpg或.JPG文件
./Large/Holidays/001.jpg
./Large/Holidays/002.jpg
./Large/Holidays/003.jpg
./Large/Pets/Dog/001.jpg
./Large/Pets/Dog/002.jpg
./Large/Pets/Cat/001.jpg

将10%的缩略图添加到具有不同顶级目录的镜像目的地("小"而不是"大"在这种情况下):

./Small/Holidays/001.jpg
./Small/Holidays/002.jpg
./Small/Holidays/003.jpg
./Small/Pets/Dog/001.jpg
./Small/Pets/Dog/002.jpg
./Small/Pets/Cat/001.jpg

这是我到目前为止所做的,但我似乎无法让它发挥作用。 $ newfile变量似乎无效但我不知道为什么,并且在测试时,它会输出' convert'命令到屏幕。任何帮助/建议都非常感谢。

#!/bin/bash

#manage whitespace and escape characters
OIFS="$IFS"
IFS=$'\n'

#create file list
filelist=$(find ./$1/ -name "*.jpg" -o -name "*.JPG")

for file in $filelist
do

#create destination path for 'convert' command
newfile= ${file/$1/$2}

convert "$file" -define jpeg:extent=10kb -scale $3% "$newfile"
done

2 个答案:

答案 0 :(得分:0)

不知道这只是一个复制/粘贴错误,还是它实际上在你的脚本中,但是这一行:

newfile= ${file/$1/$2}

在Bash中是无效的分配,因为在分配时不允许=周围的空格。

请改为尝试:

newfile=${file/$1/$2}

作为旁注。 find也有一个不区分大小写的搜索-iname,所以你可以这样做:

filelist=$(find ./$1/ -iname "*.jpg")

它还有-exec用于在结果集上执行命令。这里解释得非常好:https://unix.stackexchange.com/questions/12902/how-to-run-find-exec所以你可以在一个find中完成它。 (注意:这不一定更好,在大多数情况下,这只是一个偏好问题,我只是提到它是一种可能性。)

答案 1 :(得分:0)

所以 - 修改了工作脚本,其中包含madsen和4ae1e1建议的更正(感谢两者),并使用rsync命令首先创建目录结构(然后从目标中清除无关文件):)。我添加了一个额外的参数和参数检查器,现在您可以指定源,目标,近似目标文件大小(以kb为单位)和原始百分比。希望它可以帮助别人。 :)

#!/bin/bash

#manage whitespace and escape characters
OIFS="$IFS"
IFS=$'\n'

#check parameters
if [ $# -lt 4 ] || [ "$1" = "--help" ]
then # if no parameters or '--help' as $1 - show help
    echo "______________________________________________________________"
    echo ""
    echo "Useage: thumbnailmirror [Source] [Destination] [Filesize] [Percentage]"
    echo "Source - e.g. 'Fullsize' (directory must exist)" 
    echo "Destination - e.g. 'Thumnail' (directory must exist)"
    echo "Filesize - approx filesize in kb  e.g. '10'"
    echo "Percentage - % of reduction (1-100)"
    echo "e.g. thumbnailmirror Fullsize Thumnail 18 7"
    echo "______________________________________________________________"


else # parameters exist
    #syncronise directory structure (directories only)
    rsync -a --include '*/' --exclude  '*'  ./$1/ ./$2/
    # delete any extraneous files and directories at destination
    rsync -a --delete --existing --ignore-existing ./$1/ ./$2/
    #create file list ( -iname means not case sensitive)
    filelist=$(find ./$1/ -iname "*.jpg")

    for file in $filelist
      do
      #define destination filename for 'convert' command
      newfile=${file/$1/$2}

      if [ ! -f "$newfile" ] #if file doesn't exists create it
      then
          convert "$file" -define jpeg:extent=$3kb -quality 100 -scale $4% "$newfile"
          echo "$file resized"
      else #skip it
          echo "Skipping $file - exists already"
      fi
      done
fi