【问题标题】:What is wrong with my list naming code?我的列表命名代码有什么问题?
【发布时间】:2016-02-15 07:56:47
【问题描述】:

我想将文件名从Sub****_Ses1 更改为HU_TT_12_****_UU; (****编号从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

【问题讨论】:

  • 你好 HelpMe!欢迎来到 SO!您提出了一个有效的问题。看到您的 cmets 的答案,Up-votes 是有用和好的答案。它们不能用来表示感谢(除非答案很好)。阅读When to use upvote 上的帮助文章。
  • 谢谢。答案很有帮助,并想投票。我会等到我有足够的声誉。

标签: bash filenames long-filenames short-filenames


【解决方案1】:

for 和通配符不能这样工作。使用cut提取号码。

$ 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

【讨论】:

  • 我有 1600 个文件。我应该做 HU_TT_12_0001_UU HU_TT_12_0002_UU HU_TT_12_0003_UU HU_TT_12_0004_UU 到 HU_TT_12_1600_UU 吗??!或者这对所有人都有效?另外你只*最后一位数字是什么($ ls HU_TT_12_000*)?
  • 我不明白。通配符 Sub????_Ses1 将匹配 all 这些文件。您不必为它们命名。
  • 我想知道你为什么要添加这个? HU_TT_12_0001_UU HU_TT_12_0002_UU HU_TT_12_0003_UU HU_TT_12_0004_UU 直到 HU_TT_12_1600_UU?
  • 我没有。我的示例中的第一个 bash 命令 (touch ...) 只是创建我要移动的四个文件。第三个 bash 命令 (ls HU_TT_12_000*) 用于验证一切正常。您的问题的答案是从fro f in ... 开始并以done 结束的second bash 命令。只需在您的文件上尝试这些。
  • 对不起,我不能投票给你,因为我是菜鸟! (我需要 15 个whatevs 才能做到这一点!)
【解决方案2】:

你可以使用 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

【讨论】:

  • 我为没有投票给帮助我的人而感到难过......对不起!
  • 没问题...当你有足够的声誉时,你可以投票
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多