创建用于 OSX Automator 的批处理文件重命名脚本
Creating a batch file-renaming script for use in OSX Automator
提前致歉。在编程方面,我是一个完整的新手。我希望有人能帮助我。
根据我的工作性质,我不得不不断地重命名一堆图像。文件名有时会有所不同,但通常是某种形式的时间顺序数字,按顺序显示在它们自己的单独目录中(想想 image001.jpg 等,但不总是这种命名格式)。无论如何,我必须将这个特定目录中的所有文件重命名为“000-001.jpg”、“002-003.jpg”、“004-005.jpg”等。对于每个 jpg该单个目录中存在的文件。给定目录中通常有 10-999 张图像,但很少有人给我一些包含 1000 多张图像的目录(在这种情况下,我开始将所有文件命名为“0000-0001.jpg”、“0002-0003.jpg", 等等).
在过去的几年里,我一直在手动重命名可能有数十万张这样的图像。现在我终于在寻找一种批量重命名它们的方法,这样我就不必浪费时间这样做了。 OSX 上的 Automator 似乎是最简单的方法,但 Automator 无法按照我自己需要的方式重命名文件。
我确实注意到我可以使用 shell 脚本或 applescripts 作为 Automator 功能的一部分,所以我想知道是否有人愿意编写一个简短的脚本用于 Automator(我工作得更好带有 GUI)可以提供上述功能?不幸的是,我没有编写脚本的经验。绝对最好的理想结果是我在 Automator 应用程序中使用该脚本,只需将我需要重命名的文件拖到它上面。这将绕过我打开 OSX 终端的需要,我对它的经验也是零。
作为补充说明,我使用的是旧笔记本电脑 运行 OSX 10.6.8。我可能没有最新版本的 Applescript 等可以使用。如果有人愿意帮助我,我将不胜感激。谢谢!
-- 杰
我会在 bash
shell 中这样做,因为我发现 Applescript 非常冗长!该脚本将所有错误消息写入桌面上名为 "renamerLog.txt" 的文件中。
您必须将一个文件夹拖放到图标上。
它从指定目录复制文件,按照您在途中的要求重命名它们,到您桌面上名为 "Output" 的目录(文件夹)中,该目录在您开始之前不得存在 - 否则它会混合从不同的书上翻页。
在Automator
中看起来像这样:
您可以从下面复制并粘贴实际脚本:
# Place where we will save messages
LOG="$HOME/Desktop/renamerLog.txt"
# Clear log from any previous run
> "$LOG"
# Set up name for output directory
OUT="$HOME/Desktop/Output"
# Check user dropped a directory, rather than files
if [ ! -d "" ]; then
echo "ERROR: Please drop a DIRECTORY onto me!" >> "$LOG"
exit 1
fi
echo "Processing files in: " >> "$LOG"
# Go to that directory
cd ""
if [ $? -ne 0 ]; then
echo "ERROR: Unable to go to specified directory" >> "$LOG"
exit 1
fi
# Create output directory
mkdir "$OUT"
if [ $? -ne 0 ]; then
echo "ERROR: Unable to create output directory" >> "$LOG"
exit 1
fi
# Don't barf if no files or upper or lower case
shopt -s nullglob
shopt -s nocaseglob
# Count files to determine number of leading zeroes required
for f in *.jpg; do
((nfiles++))
done
# Tell user how many files we found and set up output formattiing
echo "Files: $nfiles" >> "$LOG"
format="$OUT/%03d-%03d.jpg"
[ $nfiles -gt 999 ] && format="$OUT/%04d-%04d.jpg" # Maybe this should be "-gt 499" rather than "-gt 999"
# Now copy the files renaming them as we go
i=0
j=1
for f in *.jpg; do
newname=$(printf $format $i $j)
((i+=2))
((j+=2))
echo Copy $f to $newname >> "$LOG"
# cp "$f" "$newname"
done
您可以尝试 运行 几次并查看日志,看看您是否喜欢它所说的,然后,如果您对它满意,您可以从中删除 #
倒数第二行,以便它实际复制文件。
我更喜欢通过复制而不是重命名来完成,因为我不想冒丢失数据的风险。
提前致歉。在编程方面,我是一个完整的新手。我希望有人能帮助我。
根据我的工作性质,我不得不不断地重命名一堆图像。文件名有时会有所不同,但通常是某种形式的时间顺序数字,按顺序显示在它们自己的单独目录中(想想 image001.jpg 等,但不总是这种命名格式)。无论如何,我必须将这个特定目录中的所有文件重命名为“000-001.jpg”、“002-003.jpg”、“004-005.jpg”等。对于每个 jpg该单个目录中存在的文件。给定目录中通常有 10-999 张图像,但很少有人给我一些包含 1000 多张图像的目录(在这种情况下,我开始将所有文件命名为“0000-0001.jpg”、“0002-0003.jpg", 等等).
在过去的几年里,我一直在手动重命名可能有数十万张这样的图像。现在我终于在寻找一种批量重命名它们的方法,这样我就不必浪费时间这样做了。 OSX 上的 Automator 似乎是最简单的方法,但 Automator 无法按照我自己需要的方式重命名文件。
我确实注意到我可以使用 shell 脚本或 applescripts 作为 Automator 功能的一部分,所以我想知道是否有人愿意编写一个简短的脚本用于 Automator(我工作得更好带有 GUI)可以提供上述功能?不幸的是,我没有编写脚本的经验。绝对最好的理想结果是我在 Automator 应用程序中使用该脚本,只需将我需要重命名的文件拖到它上面。这将绕过我打开 OSX 终端的需要,我对它的经验也是零。
作为补充说明,我使用的是旧笔记本电脑 运行 OSX 10.6.8。我可能没有最新版本的 Applescript 等可以使用。如果有人愿意帮助我,我将不胜感激。谢谢!
-- 杰
我会在 bash
shell 中这样做,因为我发现 Applescript 非常冗长!该脚本将所有错误消息写入桌面上名为 "renamerLog.txt" 的文件中。
您必须将一个文件夹拖放到图标上。
它从指定目录复制文件,按照您在途中的要求重命名它们,到您桌面上名为 "Output" 的目录(文件夹)中,该目录在您开始之前不得存在 - 否则它会混合从不同的书上翻页。
在Automator
中看起来像这样:
您可以从下面复制并粘贴实际脚本:
# Place where we will save messages
LOG="$HOME/Desktop/renamerLog.txt"
# Clear log from any previous run
> "$LOG"
# Set up name for output directory
OUT="$HOME/Desktop/Output"
# Check user dropped a directory, rather than files
if [ ! -d "" ]; then
echo "ERROR: Please drop a DIRECTORY onto me!" >> "$LOG"
exit 1
fi
echo "Processing files in: " >> "$LOG"
# Go to that directory
cd ""
if [ $? -ne 0 ]; then
echo "ERROR: Unable to go to specified directory" >> "$LOG"
exit 1
fi
# Create output directory
mkdir "$OUT"
if [ $? -ne 0 ]; then
echo "ERROR: Unable to create output directory" >> "$LOG"
exit 1
fi
# Don't barf if no files or upper or lower case
shopt -s nullglob
shopt -s nocaseglob
# Count files to determine number of leading zeroes required
for f in *.jpg; do
((nfiles++))
done
# Tell user how many files we found and set up output formattiing
echo "Files: $nfiles" >> "$LOG"
format="$OUT/%03d-%03d.jpg"
[ $nfiles -gt 999 ] && format="$OUT/%04d-%04d.jpg" # Maybe this should be "-gt 499" rather than "-gt 999"
# Now copy the files renaming them as we go
i=0
j=1
for f in *.jpg; do
newname=$(printf $format $i $j)
((i+=2))
((j+=2))
echo Copy $f to $newname >> "$LOG"
# cp "$f" "$newname"
done
您可以尝试 运行 几次并查看日志,看看您是否喜欢它所说的,然后,如果您对它满意,您可以从中删除 #
倒数第二行,以便它实际复制文件。
我更喜欢通过复制而不是重命名来完成,因为我不想冒丢失数据的风险。