【问题标题】:Naming a file with a variable in a shell script在 shell 脚本中使用变量命名文件
【发布时间】:2016-11-17 18:22:12
【问题描述】:

我正在编写一个 unix shell 脚本,它对主目录的十个子目录(标记为 1-10)中的数据进行排序。在每个子目录中,脚本需要重命名文件 hehd.output 和 fort.hehd.time,并将文件 hehd.data 复制到一个新名称的 .data 文件中。

我想做的是用以下格式重命名这些文件:

AA.BB.CC

在哪里

  AA = a variable in the hehd.data file within the subdirectory containing the file
  BB = the name of the subdirectory containing the file (1-10)
  CC = the original file name

每个子目录都包含一个 hehd.data 文件,每个 hehd.data 文件都包含字符串 ij0=AA,其中 AA 表示我想用来重命名同一子目录中的文件的变量。

例如:运行时,脚本应在 /home/4/hehd.data 中搜索字符串 ij0=2,然后将 /home/4/hehd.output 移动到 /home/4 /2.4.hehd.输出。

我目前正在使用 grep 命令让脚本搜索字符串 ij0=* 并将其复制到子目录中的新文本文件中。接下来,从文本文件中删除字符串ij0=,然后将其内容用于重命名同一子目录中的所有目标文件。 shell 脚本的最后一行删除了文本文件。

我正在寻找一种更好的方法来完成此操作,最好是所有十个子目录都可以通过相同的脚本一次排序。我的脚本似乎非常低效,并且不能自己做我想做的所有事情。

我该如何改进?

任何意见或建议将不胜感激;我正在努力成为一个更好的计算机用户,这意味着要学习更好的做事方式。

【问题讨论】:

  • 请考虑提供实际代码,而不是仅提供英文伪代码。实现细节很重要,如果不阅读实现,我们就无法看到它们是什么。
  • (另外,一般来说,StackOverflow 中优先考虑具有特定答案的重点问题;可以解释为“我们可以讨论 X 吗?”的开放式问题在这里并不完全受欢迎,因为反对“我怎样才能解决问题 X?”的问题,它有一个具体的解决方案;对于通用的“我怎样才能改进这个已经工作的代码?”问题,请参阅codereview.stackexchange.com——但请阅读网站规则在那里,而不仅仅是转发)。
  • ...stackoverflow.com/help/dont-ask 涵盖了类似的领域。

标签: bash shell sh rename local-variables


【解决方案1】:

试试这个:

fromdir=/home
for i in {1..10};do
  AA=$(sed 's/ij0=\([0-9]*\)/\1/' "$fromdir/$i/hehd.data")
  BB="$i"
  for f in "$fromdir/$i/"*;do
    CC="${f##*/}"
    if [[ "$CC" = "hehd.data" ]]; then 
      echo cp "$f" "$fromdir/$i/$AA.$BB.$CC"
    else
      echo mv "$f" "$fromdir/$i/$AA.$BB.$CC"
    fi
  done
done

它使用 Bash 序列 {1..10] 遍历目录。

在每个目录中,使用 sed 命令将 ij0 值分配给 AA 变量,将目录名称分配给 BB

在文件循环中,如果文件是hehd.data,则将其复制,否则将使用新名称重命名。

如果输出满足您的需要,您可以删除cpmv 命令之前的echo

【讨论】:

  • 如果 OP 不发布他的代码,您最终可能会得到他已经编写的相同代码。
  • @alvits 他简要描述了它不属于我的方法(从grep 输出创建文件,从文件中删除变量名,删除文件)。让我们拭目以待。
猜你喜欢
  • 2013-09-11
  • 2011-04-02
  • 2015-07-13
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多