如何删除物理文件上的(不同)后缀

时间:2019-04-17 12:47:27

标签: javascript macos applescript rename

我的桌面上的文件夹中有几个后缀长的文件。我编写了一个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的结果输出到物理文件上。

1 个答案:

答案 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;

的映射中

让我知道您是否有疑问。