AppleScript 在目录中执行 shell 脚本查找和替换

问题描述 投票:0回答:1

我已经有了一个完整的 AppleScript 查找和替换脚本,但由于 UNIX 的进程密集程度较低,我一直在尝试看看是否有更好的方法来为目录编写查找和替换脚本。

Set myFind to “string.to.find”
Set myReplace to “new.string”


Tell application “Finder” to set myPath  to the POSIX path of (target of front window as alias)

Do shell script (“echo myTarget = “ & myPath)

—// this is where I fall down 

Do shell script “grep -l “ & myFind & space & myPath & “ | xargs sed -i ‘s/“ & myFind & “/“ & myReplace &  “/g”


我不喜欢这段代码,如果有一种更简单更好的方法可以使用以下简单信息更改目标文件夹中的多个文件 小路 寻找 更换

我很高兴能得到纠正

提前谢谢您

replace find applescript
1个回答
0
投票

试试这个:

它使用 find 生成目标文件夹中的文件列表(但不包括子文件夹中的任何文件)。然后,它将该列表提供给 xargs,xargs 将每个文件提供给 sed。

Sed 对每个文件中“string.to.find”的每个实例进行简单的查找和替换,然后将该文件保存到位,同时还创建原始文件的备份(扩展名为“orig”。

use scripting additions
set myFind to "string.to.find"
set myReplace to "new.string"

tell application "Finder" to set myPath to the POSIX path of (target of front window as alias)
set qpath to quoted form of myPath

set cmd to "find " & qpath & " ! -iname '*.orig' -maxdepth 1 -type f -print0 | xargs -0 -J % sed -i.orig 's/string\\.to\\.find/new.string/g' %"

do shell script cmd

备注:

  • 使用引号形式的允许路径中存在空格或其他此类字符。
  • 为了安全起见,
    find
    命令会搜索具有“orig”扩展名的文件。
  • 进一步将搜索限制为指定目录且仅限文件。如果您想遍历任何子目录,请更改(或删除) maxdepth 选项。
  • xargs
    使用 -J 选项使
    sed
    一次仅处理单个文件。
    %
    被 sed 处理的每个文件名替换。
  • 如果每个文件中只有一个文本实例需要更改,则可以删除 sed 命令末尾的“g”。处理大文件时可能会提高速度。
  • 要在终端中测试 shell 命令,您可以通过删除“find”字符串中使用的每对反斜杠之一来实现。另外,您必须将 'qpath' 替换为实际路径,或者
    cd
    替换为目录并将 'qpath' 替换为句点 ('.')。

顺便说一句,本机 applescript 可以相当有效地处理此类编辑(假设您没有无数的巨型文件需要处理)。可能有一种高效的 ASObjC 方法可以在这种情况下表现良好。

© www.soinside.com 2019 - 2024. All rights reserved.