我的桌面上的文件夹中有几个后缀长的文件。我编写了一个JavaScript函数,该函数删除后缀并返回文件的缩写名称。如何获取JavaScript以识别文件夹中的文件名?每次都会有不同的文件。
我在repl.it中测试了该功能,并获得了所需的输出。我计划使用Mac的applescript运行javascript来完成此任务。
我搜索了如何使用JavaScript识别文件名,但研究仅使我指向了Web的url,而不是本地文件名。
const suffix = ["_sd_mov-imx30_vpal_a4x3 IMX30i 4x3; PCM 768kbps 48kHz 16bits", "_hd_mov-proresHQ422-vpal_a16x9 ProRes 422HQ 1080/25p; PCM 1152kbps 48kHz 24bits", "_hd_mxf-xdcam422_vpal_a16x9 XDCAM HD422 1080/50i; PCM 768kbps 48kHz 24bits"];
function testFile(myString) {
let replaceSuffix = "";
let result = "";
for (let x of suffix) {
if (myString.includes(x)) {
result = myString.replace(x, replaceSuffix);
}
}
return result;
}
console.log(testFile("Apple_F001_sd_mov-imx30_vpal_a4x3 IMX30i 4x3; PCM 768kbps 48kHz 16bits.mov"));
console.log(testFile("Banana_F002_hd_mov-proresHQ422-vpal_a16x9 ProRes 422HQ 1080/25p; PCM 1152kbps 48kHz 24bits.mpg"));
console.log(testFile("Carrot_F003_hd_mxf-xdcam422_vpal_a16x9 XDCAM HD422 1080/50i; PCM 768kbps 48kHz 24bits.avi"));
理想情况下,我希望这种情况发生: -将长文件名(Apple_F001_sd_mov-imx30_vpal_a4x3 IMX30i 4x3; PCM 768kbps 48kHz 16bits.mov)放入了automator文件夹中,
applescript(运行javascript)将其拾取, 删除后缀
文件重命名为缩短的文件名(Apple_F001.mov)
缺少的链接使javascript将文件名设置为函数的参数,并将javascript的结果输出到物理文件上。
答案 0 :(得分:0)
解决问题的一种方法是保留HashMap(又名Dictionary,又称Map)。
可以说文件名是Apple_F001_sd_mov-imx30_vpal_a4x3 IMX30i 4x3; PCM 768kbps 48kHz 16bits.mov
然后,您可以保留一个地图,其中Apple_F001.mov
是键,其值是原始文件名Apple_F001_sd_mov-imx30_vpal_a4x3 IMX30i 4x3; PCM 768kbps 48kHz 16bits.mov
。
接下来,我假设所有文件的格式都相同:
如果这样做,我们可以制作一个正则表达式以提取第一个单词,然后是第一个字母数字值,然后是扩展名,以创建密钥。
如果没有,则需要做出一些艰难的决定。我的建议是选择一些字符,以便您可以使用方法子字符串,然后将其与扩展名连接起来。
// So let say these are the filenames
var filenames = [
'Apple_F001_sd_mov-imx30_vpal_a4x3 IMX30i 4x3; PCM 768kbps 48kHz 16bits.mov'
, 'Banana_F002_hd_mov-proresHQ422-vpal_a16x9 ProRes 422HQ 1080/25p; PCM 1152kbps 48kHz 24bits.mpg'
, 'Carrot_F003_hd_mxf-xdcam422_vpal_a16x9 XDCAM HD422 1080/50i; PCM 768kbps 48kHz 24bits.avi'];
var fileMap = {};
for (filename in filenames){
const regex = /^([A-Za-z]+_[A-Z0-9]+)_\w[\w ;\-\/]+(\.\w+)/gm;
var tokens = regex.exec(filenames[filename]);
if (null != tokens){
var key = tokens[1].concat(tokens[2]);
var value = tokens[0];
fileMap[key] = value;
}
}
console.log(fileMap);
结果:
{
"Apple_F001.mov": "Apple_F001_sd_mov-imx30_vpal_a4x3 IMX30i 4x3; PCM 768kbps 48kHz 16bits.mov",
"Banana_F002.mpg": "Banana_F002_hd_mov-proresHQ422-vpal_a16x9 ProRes 422HQ 1080/25p; PCM 1152kbps 48kHz 24bits.mpg",
"Carrot_F003.avi": "Carrot_F003_hd_mxf-xdcam422_vpal_a16x9 XDCAM HD422 1080/50i; PCM 768kbps 48kHz 24bits.avi"
}
现在,您可以使用键显示短文件名,并跟踪稍后将用于访问的真实文件名。
说明
正则表达式/^([A-Za-z]+_[A-Z0-9]+)_\w[\w ;\-\/]+(\.\w+)/gm
表示要提取与括号中的值匹配的值,在本例中为^([A-Za-z]+_[A-Z0-9]+)
。符号^
表示它将“开始于”,括号表示我们将提取信息,[A-Za-z]+
表示一个或多个仅字母,[A-Z0-9]+
表示仅大写字母和数字, (\.\w+)
表示在点(包括点)之后得到任何东西。
我们迭代文件名并在每个文件名上执行正则表达式regex.exec(filenames[filename])
以便提取令牌数组。第一个标记的索引为0,它是完全匹配项(符合条件的整个字符串),第二个标记的索引为1,它来自第一个括号^([A-Za-z]+_[A-Z0-9]+)
,即文件名,而第三个令牌,在索引2处,与第二个括号(\.\w+)
匹配,用于文件名。
然后,我们创建键/值对并将其添加到名为fileMap fileMap[key] = value;
让我知道您是否有疑问。