在applescript中嵌入shell命令不起作用 - 如何使用空格支持名称?

时间:2016-10-29 14:21:02

标签: shell applescript

我无法让这个工作。我需要将所有.CR2文件重命名为所选目录中的* .cr2。我需要这个来处理文件名中也有空格的文件。

set varChosenfolder to POSIX path of (choose folder)
(do shell script "for file in " & varChosenfolder & "*.CR2; do mv '$file' '`basename '$file' .CR2`.cr2'; done")

我想用shell脚本执行此操作,而不是“Finder”的tell命令,因为我发现shell脚本工作得更快。

编辑: 我不知怎的设法把东西放在一起,虽然我不确定这是最好的方法。我开始使用'ls',但是我在使用名称中带有空格的foldernames和文件名时遇到了困难。 所以我最终得到了这个:

on fixextensions()
try

set varFilestorename to (do shell script "find " & varChosenfolder & " -type f -depth 1 | grep '.CR2'")


    set AppleScript's text item delimiters to {return}
    set varOldfilenames to paragraphs of varFilestorename as text
    set AppleScript's text item delimiters to ""


    repeat with i in paragraphs of varOldfilenames
        set varSinglenewfilename to ((text 1 thru -4 of i) & "cr2")
        (do shell script "mv " & "\"" & i & "\"" & space & "\"" & varSinglenewfilename & "\"")
    end repeat
on error
    #       display dialog "No CR2 files with capital letters"
end try
end fixextensions

1 个答案:

答案 0 :(得分:1)

最佳做法是永远不要通过替换动态生成的内容(如文件名)来生成代码。如果有必要这样做,那么可以通过使用引用相关内容的构造来避免严重的安全漏洞,以确保它在被解析为代码时不会是恶意的(和/或包含导致它逃脱其引用的内容和解析为代码)。

set varChosenfolder to POSIX path of (choose folder)
do shell script "for file in " & quoted form of varChosenfolder & "/*.CR2; do mv \"$file\" \"$(basename \"$file\" .CR2)\".cr2; done"

此运行的实际命令仅在以下空格(以及调用时使用的路径的细节)方面有所不同:

sh -c '
  for file in /path/to\ your/folder/*.CR2; do
    mv "$file" "$(basename "$file" .CR2)".cr2;
  done
'

值得注意的是,这个脚本:

  • 仅替换AppleScript被告知的值,以确保quoted form of构造是安全的,否则完全是硬编码。
  • 所有扩展都在双引号内执行,包括扩展basename命令的结果;这可以防止具有空格或全局字符的文字出现不合需要的行为。