【发布时间】: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"更改为正确的路径名。第一次运行它时仍然在mvcommand 前面加上echocommand,看看mvcommand 会发生什么看起来像。如果您喜欢输出,请删除echocommand 并再次运行它以重命名文件。 注意:在运行修改文件系统的命令之前,请务必确保备份! -
@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