Bash 我的列表命名代码有什么问题?

Bash 我的列表命名代码有什么问题?,bash,filenames,long-filenames,short-filenames,Bash,Filenames,Long Filenames,Short Filenames,我想将文件名从Sub****\u Ses1更改为HU\u TT\u 12.****\u (****编号从0001到1600) 我做了下面的工作 #!/bin/sh #Change file name Subj_id=/Users/dave/biomark/dat cd Subj_id for abcd in Sub****_Ses1; do mv Sub$a$b$c$d_Ses1 HU_TT_12_$a$b$c$d_UU; done for和通配符不是这样工作的。用于提取数字 $

我想将文件名从
Sub****\u Ses1
更改为
HU\u TT\u 12.****\u
(****编号从0001到1600)

我做了下面的工作

#!/bin/sh
#Change file name 

Subj_id=/Users/dave/biomark/dat

cd Subj_id

for abcd in Sub****_Ses1; do

mv Sub$a$b$c$d_Ses1 HU_TT_12_$a$b$c$d_UU;

done

for
和通配符不是这样工作的。用于提取数字

$ touch Sub000{1,2,3,4}_Ses1 
$ for f in Sub????_Ses1      
do
    abcd=$(echo $f | cut -b4-7)
    mv $f HU_TT_12_${abcd}_UU
done
$ ls HU_TT_12_000*
HU_TT_12_0001_UU  HU_TT_12_0002_UU  HU_TT_12_0003_UU  HU_TT_12_0004_UU
您可以使用sed和mv

       #!/bin/bash
       set -x
       Subj_id=/Users/dave/biomark/dat
       cd $Subj_id

       for i in Sub*_Ses1 ; do
       #echo $i|sed -r 's/^.*\([[:digit:]]{4}\).*/HU_TT_12_\1_UU/'
       mv $i $(echo $i|sed -rn 's/^.*([[:digit:]]{4}).*/HU_TT_12_\1_UU/ p')
       done

我有1600个文件。我是不是应该做HU_-TT_12_0001_-HU_-TT_12_0002_-HU_-TT_12_0003_-HU_-TT_12_0004_直到HU_-TT_12_1600_??!或者这对所有人都有效?还有,你刚才说了什么?最后一个数字($ls HU_TT_12_000*)?我不明白。通配符
Sub???\u Ses1
将匹配所有这些文件。你不必说出他们的名字。我想知道你为什么加上这个?我不知道。我的示例中的第一个bash命令(
touch…
)就是创建我要移动的四个文件。第三个bash命令(
ls HU_TT_12_000*
)用于验证所有操作是否正常。您的问题的答案是第二个bash命令,该命令从f in…
开始,结束于
done
。在你的档案上试试这些。对不起,我不能给你投票,因为我是个笨蛋!(我需要15个什么样的人才能做到!)我为没有投票给帮助我的人而感到难过……对不起!没问题。。。当你有足够的声誉时,你可以投票。你好,帮帮我!欢迎来到SO!你问了一个正确的问题。看到你对答案的评论,向上投票是为了找到有用和好的答案。它们不能用来表示感激(除非答案是好的)。请阅读上的帮助文章。谢谢。答案是有帮助的,并希望提高投票率。我会等到我有足够的名声。