【问题标题】:terminal command: handle special characters in filename终端命令:处理文件名中的特殊字符
【发布时间】:2017-03-19 21:03:03
【问题描述】:

我想在终端中执行一些命令。我在 Swift 3.0 中创建它们并将它们写入命令文件。但是一些特殊字符会产生问题,例如单引号:

mv 'Don't do it.txt' 'Don_t do it.txt'

我使用单引号来覆盖其他特殊字符。但是单引号本身是什么。如何以可以正确处理每个可能的文件名的方式转换它们?

【问题讨论】:

  • 对于这种特定情况,您可以使用mv "Don't do it.txt" 'Don_t do it.txt'... 但可能不适用于您的其他情况.. 所以也许将其他情况添加到问题中?
  • 我正在寻找适用于所有文件名的通用引号。如果我使用双引号,包含双引号的文件名会产生问题。所以我认为像 Steven 所示插入转义符将是唯一的解决方案。

标签: swift bash shell character filenames


【解决方案1】:

你的问题很奇怪:

  1. 在这种情况下,我们将写入 shell 脚本而不是文本文件

  2. 您正在替换输出文件名中的单引号,而不是空格, 应该换掉的

这是一个为输入文件提供正确转义的解决方案,并且 替换(读取:空格)输出文件:

#!/usr/bin/awk -f
BEGIN {
  mi = "\47"
  no = "[^[:alnum:]%+,./:=@_-]"
  print "#!/bin/sh"
  while (++os < ARGC) {
    pa = split(ARGV[os], qu, mi)
    printf "mv "
    for (ro in qu) {
      printf "%s", match(qu[ro], no) ? mi qu[ro] mi : qu[ro]
      if (ro < pa) printf "\\" mi
    }
    gsub(no, "_", ARGV[os])
    print FS ARGV[os]
  }
}

结果:

#!/bin/sh
mv 'dont do it!.txt' dont_do_it_.txt
mv Don\''t do it.txt' Don_t_do_it.txt
mv dont-do-it.txt dont-do-it.txt

【讨论】:

  • 谢谢。我想我必须搜索所有特殊字符并添加转义字符。所以就像你的第二个例子一样,但也覆盖了空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多