我无法让这个工作。我需要将所有.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
答案 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
'
值得注意的是,这个脚本:
quoted form of
构造是安全的,否则完全是硬编码。basename
命令的结果;这可以防止具有空格或全局字符的文字出现不合需要的行为。