在 shell 脚本中使用变量命名文件

Naming a file with a variable in a shell script

我正在编写一个 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 .输出到 /home/4/2.4.hehd.output.

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

我正在寻找一种更好的方法来完成此任务,最好是可以通过同一脚本一次对所有十个子目录进行排序。我的脚本似乎效率低得令人难以置信,而且它本身并不能完成我想要它完成的所有事情。

我该如何改进?

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

试试这个:

fromdir=/home
for i in {1..10};do
  AA=$(sed 's/ij0=\([0-9]*\)//' "$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