【问题标题】:Fish: batch rename files with spaces in names using mv and sedFish:使用 mv 和 sed 批量重命名名称中带有空格的文件
【发布时间】:2020-10-08 13:38:34
【问题描述】:

我正在尝试从命令行重命名多个文件,如下所示:

for f in *.pdf
    mv $f echo $f | sed 's/\( \)\([0-9]\)/-\2/'
end

我得到了错误:

mv: target 'filename' is not a directory

很明显,目标名称有空格,必须用引号括起来才能被mv命令处理。

我应该怎么做才能让这个脚本正常工作?

【问题讨论】:

  • 如果您已经发现问题的原因是引用,为什么不能在代码中添加引号来解决它?

标签: command-line scripting fish


【解决方案1】:

您的脚本将尝试将文件和名为“echo”的文件移动到文件中,并将mv 的输出通过管道传输到sed

您想要的是在命令替换中运行 echo | sed,fish 用 () 表示:

for f in *.pdf
    mv $f (echo $f | sed 's/\( \)\([0-9]\)/-\2/')
end

很明显,目标的名字有空格,必须用引号括起来才能被mv命令处理。

它并不明显,因为它不需要被引用。 Fish 不像 bash 那样执行分词。文件名设置一次,然后$f 将始终将文件名作为一个参数。

"$f" 这样引用它完全是多余的。

对于命令替换,它只在 newlines 上分割它们,而不是空格,所以除非你的文件名带有换行符(极不可能)你不会有那里也有问题。

如果你这样做了,你必须使用string collect like

for f in *.pdf
    mv $f (echo $f | sed 's/\( \)\([0-9]\)/-\2/' | string collect)
end

确保命令替换产生一个参数。

【讨论】:

  • 完美运行!非常感谢您的扩展回答!
猜你喜欢
  • 2011-08-06
  • 2011-01-23
  • 2014-06-08
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
相关资源
最近更新 更多