【问题标题】:rename command usage in ubuntu machine for rename a set of files在 ubuntu 机器中重命名命令用于重命名一组文件
【发布时间】:2019-04-10 03:44:38
【问题描述】:

我有一个用于重命名文件夹中多个文件的 shell 脚本。它在 rhel 主机上工作,但在 ubuntu14 主机上抛出错误。

#!/usr/bin/env bash

SOME_NUMBER=1
rename _file_name.c _file_${SOME_NUMBER}.c path/of/file/*_file_name.c

我应该对代码进行哪些更改才能使其在 ubuntu14 主机上运行?

EDIT-1:

为了在 ubuntu 机器上运行代码,我做了以下更改,它可以工作:

rename 's/\_file_name.c$/\_file_1.c/' path/of/file/*_file_name.c

但以下不起作用,我收到以下错误消息:

rename 's/\_file_name.c$/\_file_${SOME_NUMBER}.c/' path/of/file/*_file_name.c

错误信息:

Global symbol "$SOME_NUMBER" requires explicit package name at (eval 1) line 1.
Global symbol "$SOME_NUMBER" requires explicit package name at (eval 1) line 1.

【问题讨论】:

  • 这是perl 错误消息,而不是bash。但是${SOME_NUMBER} 会被shell 扩展,它不应该被perl 看到。
  • 那是脚本的精确副本吗?如果 _file_${SOME_NUMBER}.c 用单引号括起来,您会收到该错误。
  • 你是对的 Barmar。我已经编辑了问题陈述。
  • 你知道@ShijithR 吗?他们在 1 小时前发布了一个非常相似的问题(他们已经将其删除),并且还在问题中发布了错误类型的引号。

标签: bash shell ubuntu scripting ubuntu-14.04


【解决方案1】:

单引号防止参数扩展。因为 Perl 和 shell 的语法在这方面很相似,所以将文字字符串 s/\_file_name.c$/\_file_${SOME_NUMBER}.c/ 传递给 Perl,在那里它尝试扩展未定义的变量 $SOME_NUMBER

改用双引号:

rename "s/\_file_name.c$/\_file_${SOME_NUMBER}.c/" path/of/file/*_file_name.c

Difference between single and double quotes in Bash

确保您的 shell 脚本中 SOME_NUMBER 的值确实只是一个数字,或者至少是一个数字,当展开时会产生一个有效的 Perl 表达式。

【讨论】:

  • 感谢 Barmar 和 Chepner。建议的解决方案对我有用。
猜你喜欢
  • 1970-01-01
  • 2016-05-29
  • 2013-08-27
  • 2019-09-02
  • 2018-04-14
  • 2012-03-05
  • 1970-01-01
  • 2015-03-21
  • 2012-02-18
相关资源
最近更新 更多