【问题标题】:Rename all files of the same extension within subfolders of a directory using apple script?使用苹果脚本重命名目录子文件夹中具有相同扩展名的所有文件?
【发布时间】:2019-12-10 20:20:29
【问题描述】:

我有一个充满文件夹的目录,每个文件夹的子文件夹都包含一个 .xml 文件。它们都应该命名为 apple.xml,但不幸的是,它们都有不同的名称,例如 apple_1.xml 或 appleTEST.xml 以及其他不遵循特定模式的独特变体。幸运的是,每个文件夹只有一个 .xml 文件。

我希望有一种方法可以使用 Applescript 在整个目录及其所有文件夹中搜索扩展名为 .xml 的文件并将它们全部重命名为 apple.xml?

谢谢

【问题讨论】:

  • 我只需从 Terminal 使用以下 compound 命令 IFS=; while read -r f; do echo mv -v "$f" "${f%/*}/apple.xml"; done <<< "$(find "/path/to/parent_XML_dir" -type f -iname '*.xml')" 执行此操作,同时将 "/path/to/parent_XML_dir" 更改为正确的路径名。第一次运行它时仍然在mv command 前面加上echo command,看看mv command 会发生什么看起来像。如果您喜欢输出,请删除 echo command 并再次运行它以重命名文件。 注意:在运行修改文件系统的命令之前,请务必确保备份!
  • @user3439894 - 当路径名的一部分包含换行符时会失败。见how to find & safely handle file names containing newlines。将-print0 选项与find 一起使用,以确保在重定向到while 循环之前,每个路径名都用NUL 字节(\0) 分隔。要在 while 循环中读取 NUL 字符,请将 -d '' 选项添加到 read。例如:while IFS= read -rd '' f; do echo mv -v "$f" "${f%/*}/apple.xml"; done < <(find "/path/to/parent_XML_dir" -type f -iname '*.xml' -print0)
  • 演示:1. 创建测试文件,运行:mkdir -p ~/Desktop/foo/{a..c} && touch ~/Desktop/foo/{a..b}/apple_1.xml && touch ~/Desktop/foo/c/$'apple\napple.xml' - 请注意文件夹c 中的多行文件名。 2. 运行您的 cmd:IFS=; while read -r f; do mv -v "$f" "${f%/*}/apple.xml"; done <<< "$(find ~/Desktop/foo -type f -iname '*.xml')" - 请注意,文件夹 c` 中的文件尚未重命名。 3. 清理,运行 rm -rf ~/Desktop/foo 并重复第 1 点。4. 运行 while IFS= read -rd '' f; do mv -v "$f" "${f%/*}/apple.xml"; done < <(find ~/Desktop/foo -type f -iname '*.xml' -print0)

标签: applescript file-rename batch-rename


【解决方案1】:

这个 AppleScript 代码几乎是不言自明的,应该适合你。

-- Choose Parent Folder To Search For .xml Files
set searchFolder to POSIX path of (choose folder)

-- Get Paths Of All .xml Files In The Parent Folder And All Sub Folders
set xmlFiles to do shell script "find " & (quoted form of searchFolder) & " -name *.xml"

-- Create A List From The Result
set xmlFiles to paragraphs of xmlFiles as list

-- Loops Through The List And Renames Each File
repeat with i in xmlFiles
    tell application "System Events" to set name of disk item i to "apple.xml"
end repeat

【讨论】:

  • 没有必要将 (do shell script ...) 发送到 find 命令,然后必须解析其输出或运行循环 (repeat with ...)在其解析的输出上单独对每个文件执行操作如果必须向find 发送电子邮件,那么最好从 Terminal 执行此操作,因为必要的 command 是已经在昨天对 OP 的评论中。此外,(quoted form of searchFolder) 周围的括号不是必需的
  • @wch1zpink - 提示:当想要分配每个路径名(即 find 实用程序打印到 stdout 的内容)时,请谨慎使用 set xmlFiles to paragraphs of xmlFiles as list AppleScript list 中的一个项目。任何包含换行符 \n 的路径名都将创建多个列表 items 而不是一个。为了提高程序的健壮性,请使用自定义子例程,例如我的答案 here 中名为 transformStdoutToList 的子例程。
【解决方案2】:

因为您已经声明每个 子文件夹 中只有一个 XML 文件,所以使用 AppleScript.

以下示例 AppleScript 代码将按照您的要求执行,在您选择父 XML 文件夹之后> 出现提示时,通过在例如脚本编辑器中运行此代码

tell application "Finder"
    set xmlFilesList to a reference to ¬
        (every file of entire contents of ¬
            (choose folder with prompt "Please Select Parent XML Folder:") ¬
                whose name extension is "xml")
    set name of xmlFilesList to "apple.xml"
end tell

示例 AppleScript 代码 执行起来简单快速,并且为您提供了选择正确的父 XML 文件夹 应该没有任何问题。 注意:在运行修改文件系统的命令之前,请务必确保备份!

【讨论】:

  • 使用reference to 运算符的不错选择。有趣的是,我实际上考虑并想知道如果我要引用这些文件,我是否能够在不使用循环的情况下一次性重命名它们。甚至没有尝试,我认为它会引发错误,所以我什至没有尝试 LOL。 +1。此外,脚本调试器会自动插入您提到的括号
  • @wch1zpink,我不得不承认 CJK 让我在我的一些个人 脚本 中使用了 a reference to,当我在 OP 中看到只有一个 XML 文件时在每个子文件夹中,我认为这是使用它的最佳时机。昨天我向 OP 发帖建议使用终端,因为我可以在脑海中写下它,并且不在 Mac(在 Linux 机器上)上,我可以在发布之前对其进行测试。今天我又回到了 Mac 上。哦,Script Debugger 是罪魁祸首,从技术上讲,Script Editor 或 Automator 不需要它们。也许这样做是为了让它看起来更漂亮。感谢您的 +1!
猜你喜欢
  • 2017-10-25
  • 2021-10-08
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2021-04-06
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多