Bash 将 Apple 标签(Mavericks 标签)导出到 IPTC "Keywords" 元数据的脚本(使用 'Tag' 和 'ExifTool')
Bash Script that exports Apple Tags (Mavericks Tags) to IPTC "Keywords" metadata (using 'Tag' and 'ExifTool')
我的最终解决方案:
将以下脚本(根据 damienfrancois 的回答修改)保存到文件中,例如 "photos.sh".
IFS=$'\n';
for file in $(find ./ -name '*.jpg' -or -name '*.JPG' -or -name '*.tif' -or -name '*.JPEG'); # iterate over each file
do
taglist="$(tag --no-name --list "$file")" # get a comma-separated list (string) of tags
IFS=',' read -ra tagarray <<< "$taglist" # convert that string to an array
for tag in "${tagarray[@]}" # loop over that array of tags
do
exiftool -Keywords+="$tag" "$file" # add tag to file
done
done
不要忘记通过执行以下操作使脚本可执行
chmod 755 /path/to/script/dir/photos.sh
安装 "Tag by JDBerry" 并安装 "ExifTool by Phil Harvey"。使用终端转到所选目录。该目录只能包含“.jpg”、“.JPG”、“.tif”和“.JPEG”文件,脚本将递归遍历根目录但不会更改其他文件类型。成功的输出应该是这样的:
~ > cd /path/to/images/dir/
/path/to/images/dir/ > /path/to/script/dir/photos.sh
1 image files updated
1 image files updated
脚本会将原始文件的副本保留为 "img.jpg_original"。所有 Apple 标签将从最终文件中删除 "img.jpg"。请记得在确定一切正常后删除“_original”文件(我使用的是 Spotlight)。
我原来的问题:
我经常使用 OS X 上的终端执行 rysnc、ssh 等任务,但在 bash 脚本编写方面我仍然是个菜鸟。客户有大量图像,它们已使用 OS X 标签进行标记。我需要将这些标签附加到 IPTC 元数据中。
到目前为止,我已经能够使用 "Tag by JDBerry"
执行以下操作
~ > tag --no-name --list /path/to/img/example.jpg
Orange,Red
我还能够使用 Phil Harvey 的 ExifTool 执行以下操作
~ > exiftool -Keywords+='Orange' /path/to/img/example.jpg
1 image files updated
~ > exiftool -Keywords+='Red' /path/to/img/example.jpg
1 image files updated
是否有 Bash 脚本专家愿意并能够帮助我?我正在考虑以下内容(用伪代码编写):
$imgDir[] = function that adds all images in directory to array;
foreach ($imgDir as $pathToImg) {
$tagsArray[] = function that executes "tag --no-name --list $pathToImg" and saves return value;
$numberOfTags = count($tagsArray);
if ($numberOfTags != NULL) {
for ($i = 1; $i <= $numberOfTags; $i++) {
function that executes "exiftool -Keywords+='$tagsArray[$i-1]' $pathToImg;"
}
}
}
这是一个未经测试的解决方案,应该适合您。虽然它可能需要抛光。
for file in /path/to/img/*.jpg # iterate over each file
do
taglist="$(tag --no-name --list \"$file\")" # get a comma-separated list (string) of tags
IFS=',' read -ra tagarray <<< "$taglist" # convert that string to an array
for tag in "${tagarray[@]}" # loop over that array of tags
do
exiftool -Keywords+="$tag" "$file" # add tag to file
end
end
您可以将内部 for
循环和 read
命令合并为一个 while
循环,但我认为这会牺牲可读性。
以上答案已修改
好的,这就是我为那些 Mac 想要详细信息的用户工作的方式。
将以下脚本(根据 damienfrancois 的回答修改)保存到 "photos.sh".
等文件中
for file in *.jpg # iterate over each file
do
taglist="$(tag --no-name --list "$file")" # get a comma-separated list (string) of tags
IFS=',' read -ra tagarray <<< "$taglist" # convert that string to an array
for tag in "${tagarray[@]}" # loop over that array of tags
do
exiftool -Keywords+="$tag" "$file" # add tag to file
done
done
不要忘记通过执行以下操作使脚本可执行
chmod 755 /path/to/script/dir/photos.sh
从 https://github.com/jdberry/tag/ and also install ExifTool from http://www.sno.phy.queensu.ca/~phil/exiftool/ 安装标签。使用终端转到所选目录。该目录只能包含“.jpg”文件,脚本不会递归迭代或更改其他文件类型。
成功的输出应该是这样的:
~ > cd /path/to/images/dir/
/path/to/images/dir/ > /path/to/script/dir/photos.sh
1 image files updated
1 image files updated
脚本会将原始文件的副本保留为 "img.jpg_original"。所有 Apple 标签将从最终文件中删除 "img.jpg"。请记得在确定一切正常后删除 "original" 文件(我使用的是 Spotlight)。
自动化工作流程
你好,我试着用它制作一个 automator 工作流程。
注意:
Apple 默认在 Mavericks 中启用智能引号,
这意味着它 默认情况下会自动更正和崩溃您的代码。
在 Automator 中,您必须在“运行 shell 脚本”文本框中右键单击。
/上下文菜单/替换 options/smart 引号
并在每个新 document/duplicate.
中禁用它
*更新:
您也可以通过在系统Preferences/Keyboard/Text/SmartQuotes中将自动更正设置为“直引号”来禁用它(最低项在下拉列表中),然后可选择禁用自动更正。
这将永久更改 automator 中的默认值。
https://derflounder.wordpress.com/2014/02/01/disabling-smart-quotes-in-mavericks/
首先我制作了一个“询问查找器项目”框:
类型:文件夹
允许多选
然后我添加了一个“运行 shell 脚本”框:
shell: bin/bash
传递输入:作为参数
并在选项中:
启用工作流 运行 时显示此操作。
这里是代码的另一个迭代:
#!/bin/bash
cd "" #changes directory to selected folder
IFS=$'\n';
for file in $(find ./ -name '*.jpg' -or -name '*.jpeg' -or -name '*.JPG' -or -name '*.pdf' -or -name '*.tiff'); #added all file types i liked.
do
taglist="$(/usr/local/bin/tag --no-name --list "$file")" # inserted full file paths /usr/local/bin/tag to make automator find it. these paths can vary.
IFS=',' read -ra tagarray <<< "$taglist"
for tag in "${tagarray[@]}"
do
/usr/local/bin/exiftool -Keywords-="$tag" "$file" -Keywords+="$tag" "$file" -overwrite_original_in_place --a
#inserted full file paths /usr/local/bin/exiftool to make automator find it. these paths can vary
#added -overwrite_original_in_place = updating original image:Can possible DESTROY! your data. Use with caution!
#added -Keywords-="$tag" to prevent duplicate keywords: removes allready assigned keywords first.
done
done
我是新手
所以小心处理。
如果您找到更好的解决方案,请随时修复。我很高兴听到你的方法。
感谢前面所有的发言者发帖。
我的最终解决方案:
将以下脚本(根据 damienfrancois 的回答修改)保存到文件中,例如 "photos.sh".
IFS=$'\n';
for file in $(find ./ -name '*.jpg' -or -name '*.JPG' -or -name '*.tif' -or -name '*.JPEG'); # iterate over each file
do
taglist="$(tag --no-name --list "$file")" # get a comma-separated list (string) of tags
IFS=',' read -ra tagarray <<< "$taglist" # convert that string to an array
for tag in "${tagarray[@]}" # loop over that array of tags
do
exiftool -Keywords+="$tag" "$file" # add tag to file
done
done
不要忘记通过执行以下操作使脚本可执行
chmod 755 /path/to/script/dir/photos.sh
安装 "Tag by JDBerry" 并安装 "ExifTool by Phil Harvey"。使用终端转到所选目录。该目录只能包含“.jpg”、“.JPG”、“.tif”和“.JPEG”文件,脚本将递归遍历根目录但不会更改其他文件类型。成功的输出应该是这样的:
~ > cd /path/to/images/dir/
/path/to/images/dir/ > /path/to/script/dir/photos.sh
1 image files updated
1 image files updated
脚本会将原始文件的副本保留为 "img.jpg_original"。所有 Apple 标签将从最终文件中删除 "img.jpg"。请记得在确定一切正常后删除“_original”文件(我使用的是 Spotlight)。
我原来的问题:
我经常使用 OS X 上的终端执行 rysnc、ssh 等任务,但在 bash 脚本编写方面我仍然是个菜鸟。客户有大量图像,它们已使用 OS X 标签进行标记。我需要将这些标签附加到 IPTC 元数据中。
到目前为止,我已经能够使用 "Tag by JDBerry"
执行以下操作~ > tag --no-name --list /path/to/img/example.jpg
Orange,Red
我还能够使用 Phil Harvey 的 ExifTool 执行以下操作
~ > exiftool -Keywords+='Orange' /path/to/img/example.jpg
1 image files updated
~ > exiftool -Keywords+='Red' /path/to/img/example.jpg
1 image files updated
是否有 Bash 脚本专家愿意并能够帮助我?我正在考虑以下内容(用伪代码编写):
$imgDir[] = function that adds all images in directory to array;
foreach ($imgDir as $pathToImg) {
$tagsArray[] = function that executes "tag --no-name --list $pathToImg" and saves return value;
$numberOfTags = count($tagsArray);
if ($numberOfTags != NULL) {
for ($i = 1; $i <= $numberOfTags; $i++) {
function that executes "exiftool -Keywords+='$tagsArray[$i-1]' $pathToImg;"
}
}
}
这是一个未经测试的解决方案,应该适合您。虽然它可能需要抛光。
for file in /path/to/img/*.jpg # iterate over each file
do
taglist="$(tag --no-name --list \"$file\")" # get a comma-separated list (string) of tags
IFS=',' read -ra tagarray <<< "$taglist" # convert that string to an array
for tag in "${tagarray[@]}" # loop over that array of tags
do
exiftool -Keywords+="$tag" "$file" # add tag to file
end
end
您可以将内部 for
循环和 read
命令合并为一个 while
循环,但我认为这会牺牲可读性。
以上答案已修改
好的,这就是我为那些 Mac 想要详细信息的用户工作的方式。
将以下脚本(根据 damienfrancois 的回答修改)保存到 "photos.sh".
等文件中for file in *.jpg # iterate over each file
do
taglist="$(tag --no-name --list "$file")" # get a comma-separated list (string) of tags
IFS=',' read -ra tagarray <<< "$taglist" # convert that string to an array
for tag in "${tagarray[@]}" # loop over that array of tags
do
exiftool -Keywords+="$tag" "$file" # add tag to file
done
done
不要忘记通过执行以下操作使脚本可执行
chmod 755 /path/to/script/dir/photos.sh
从 https://github.com/jdberry/tag/ and also install ExifTool from http://www.sno.phy.queensu.ca/~phil/exiftool/ 安装标签。使用终端转到所选目录。该目录只能包含“.jpg”文件,脚本不会递归迭代或更改其他文件类型。 成功的输出应该是这样的:
~ > cd /path/to/images/dir/
/path/to/images/dir/ > /path/to/script/dir/photos.sh
1 image files updated
1 image files updated
脚本会将原始文件的副本保留为 "img.jpg_original"。所有 Apple 标签将从最终文件中删除 "img.jpg"。请记得在确定一切正常后删除 "original" 文件(我使用的是 Spotlight)。
自动化工作流程
你好,我试着用它制作一个 automator 工作流程。
注意:
Apple 默认在 Mavericks 中启用智能引号, 这意味着它 默认情况下会自动更正和崩溃您的代码。
在 Automator 中,您必须在“运行 shell 脚本”文本框中右键单击。
/上下文菜单/替换 options/smart 引号
并在每个新 document/duplicate.
*更新:
您也可以通过在系统Preferences/Keyboard/Text/SmartQuotes中将自动更正设置为“直引号”来禁用它(最低项在下拉列表中),然后可选择禁用自动更正。 这将永久更改 automator 中的默认值。
https://derflounder.wordpress.com/2014/02/01/disabling-smart-quotes-in-mavericks/
首先我制作了一个“询问查找器项目”框:
类型:文件夹 允许多选
然后我添加了一个“运行 shell 脚本”框:
shell: bin/bash
传递输入:作为参数
并在选项中: 启用工作流 运行 时显示此操作。
这里是代码的另一个迭代:
#!/bin/bash
cd "" #changes directory to selected folder
IFS=$'\n';
for file in $(find ./ -name '*.jpg' -or -name '*.jpeg' -or -name '*.JPG' -or -name '*.pdf' -or -name '*.tiff'); #added all file types i liked.
do
taglist="$(/usr/local/bin/tag --no-name --list "$file")" # inserted full file paths /usr/local/bin/tag to make automator find it. these paths can vary.
IFS=',' read -ra tagarray <<< "$taglist"
for tag in "${tagarray[@]}"
do
/usr/local/bin/exiftool -Keywords-="$tag" "$file" -Keywords+="$tag" "$file" -overwrite_original_in_place --a
#inserted full file paths /usr/local/bin/exiftool to make automator find it. these paths can vary
#added -overwrite_original_in_place = updating original image:Can possible DESTROY! your data. Use with caution!
#added -Keywords-="$tag" to prevent duplicate keywords: removes allready assigned keywords first.
done
done
我是新手 所以小心处理。
如果您找到更好的解决方案,请随时修复。我很高兴听到你的方法。
感谢前面所有的发言者发帖。