【问题标题】:Terminal: Use image information from sips for renaming files终端:使用 sips 中的图像信息重命名文件
【发布时间】:2017-05-31 11:04:04
【问题描述】:

命令sips 有一个很好的选项来从文件中读取信息。以下命令循环遍历所有图像并显示有关宽度或高度的信息:

for i in *.jpg; do sips -g pixelWidth $i;done

for i in *.jpg; do sips -g pixelHeight $i;done 

现在我想阅读此信息并将其与mv 一起使用来重命名图像,如下所示:

image-widthxheight.jpg

image-1600x900.jpg

我想要完成的最后一件事是,使用sips 调整图像大小并将新信息直接写入文件名。

有人知道如何从宽度和高度中提取信息并将其与mv 一起使用吗?

【问题讨论】:

  • 您可以将这些命令的结果保存在变量中并使用我假设的那些,例如width="$(sips -g pixelWidth "$1")",我假设。我不熟悉 sips 也不熟悉如何调整大小
  • 谢谢,我找到了我的解决方案……我把它贴在这里:)

标签: bash image terminal rename sips


【解决方案1】:

我自己发现的。现在这是一个不错的 bash 脚本。也许不是那么优雅,但它确实有效——它也可以作为 gist on GitHub 使用。

感谢建议的新版本 - 查看评论

#!/bin/bash
#
#   1. This script copies all *.jpg-files to a new folder
#   2. Jumps into folder and resizes all files with sips
#   3. Renames all files and uses information from sips
#
folder="resized_and_renamed"

mkdir -p "$folder"

cp *.jpg "$folder"

cd "$folder"

# RESIZE ALL IMAGES TO MAXIMUM WIDTH/HEIGHT OF 360
sips -Z 360 *.jpg

# RENAME FILES WITH INFORMATION FROM SIPS
for i in *.jpg
  do
    pixelWidth=$(sips -g pixelWidth "$i" | awk '/pixelWidth:/{print $2}')
    pixelHeight=$(sips -g pixelHeight "$i" | awk '/pixelHeight:/{print $2}')
    # REMOVE EXTENSION
    filename=${i%.jpg}
    # NOW RENAME
    mv $i ${filename##*/}-${pixelWidth}x${pixelHeight}.jpg
  done

【讨论】:

  • 您的cp 不需要循环,您正在复制其中每个文件的所有文件,因此如果您有 10 个文件,您将全部复制 10 次(假设您没有太多参数列表太长)。然后,一定要引用你的变量,如果其中任何一个有IFS 字符,你最终不会运行你期望的命令,或者至少没有你期望的参数,最后2个循环可能真的是一个循环,只需调整大小然后移动
  • 您的脚本中有很多次优方面...我将在每条评论中说明一个方面,以便它清晰易读。
  • 1.您使用resized_and_renamed 3 次会产生维护问题,您应该考虑使用单个变量,这意味着只需维护。所以sub=resized_and_renamed,然后是mkdir "$sub"等等。
  • 2.考虑使用mkdir -p "$new",这样它就可以运行多次而不会出错。您的脚本将在第二次和后续调用时出错。
  • 3.第 12-15 行应该只是 cp *.jpg "$new" 而不是循环。
猜你喜欢
  • 2018-07-27
  • 1970-01-01
  • 2021-07-23
  • 2014-06-26
  • 1970-01-01
  • 2019-05-12
  • 2011-07-20
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多