在 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
,则复制它,否则用新名称重命名。
如果输出满足您的需要,您可以删除 cp
和 mv
命令之前的 echo
。
我正在编写一个 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
,则复制它,否则用新名称重命名。
如果输出满足您的需要,您可以删除 cp
和 mv
命令之前的 echo
。