批量修改文件件名前缀,如何在文件的名字前面加上所在文件夹名字作为前缀?

————————————————1h后的分隔线————————————————

无聊试了一下。帮你写好了。mac terminal

cd到大目录(如TCIA)后,输入

for file in `find . -name "*.txt"`; do var=${file%/*} && var=${var##*/} && mv $file `dirname $file`/$var-`basename $file` ;done

即可。

*.txt可以换为*.dcm,*.pdf等等,帮你实现只更改一种类型文件。此代码可以用于多层文件夹,将需处理的最上级文件夹设为工作目录即可。

运行Terminal时请先小批量尝试,注意原始文件备份!祝好!

————————————————原始回答——————————————————

使用mac的terminal。

前几天刚好写了一段,是题主的逆命题。在此讲解一下思路,希望对题主有所启发。

先上代码:

for dir in `find . -type d`; do ls $dir/*.dcm&>/dev/null && c3d -dicom-series-list $dir > $dir/1.txt&& sed 's/[ ][ ]*/_/g' $dir/1.txt > $dir/2.txt && sed's#/#_#g' $dir/2.txt > $dir/3.txt && var=`sed -n "2,1p"$dir/3.txt | awk '{print $4}'` && mv $dir `dirname $dir`/$var`basename$dir`; done

TCIA的文件夹非常繁杂,标题不含每个dicom序列的基本信息,故本代码的作用是把dcm序列的上级文件夹命名为该dcm序列的名称。

原始文件:

Terminal运行代码后:

我的代码将dcm文件的内容如“AX_FLAIR”注入文件夹原名“1.3.6....“之前,这样点开文件夹就可以知道文件夹内是哪个序列,解决了拖进专业读图软件才能知道内容的烦恼。

下面讲解下代码。

首先cd进入工作目录。

cd Desktop/TCIA/

然后整串代码输入:

for dir in `find . -type d`; do ls $dir/*.dcm&>/dev/null && c3d -dicom-series-list $dir > $dir/1.txt&& sed 's/[ ][ ]*/_/g' $dir/1.txt > $dir/2.txt && sed's#/#_#g' $dir/2.txt > $dir/3.txt && var=`sed -n "2,1p"$dir/3.txt | awk '{print $4}'` && mv $dir `dirname $dir`/$var`basename$dir`; done

分步详解:

for dir in `find . -type d`;#列出工作目录下所有的文件夹(即路径dir)

do ls $dir/*.dcm &>/dev/null#do为do循环的开头。后面是列出(ls)所有含有dcm文件的上述dir,是一个筛选过程,但是这个列表我们并不需要,所以赋值给了dev/null,相当于一个垃圾桶。

&& #所有均为连接符,如果左侧返回值为真,也就是上一步成功运行,那么执行右侧下一步。

c3d -dicom-series-list $dir > $dir/1.txt #用一款软件读取dir下的dicom序列的详细信息,并把结果存入1.txt。PS:braintumor的segmentation可用ITK-SNAP或3D-slicer进行,个人喜欢前者,半自动化。这个c3d是SNAP的一个相关命令行软件Convert3D的命令,它也可以在terminal中运行:

读出的1.txt如图:

sed 's/[ ][ ]*/_/g' $dir/1.txt > $dir/2.txt#因为文件名中不能包含空格,所以将1.txt中的空格(不管有多少空格)用_代替,存入2.txt。

sed 's#/#_#g' $dir/2.txt > $dir/3.txt。如你所言,TCGA的数据很乱,各种表达,有些一个空格有些一串空格有些竟然还有“/”,这一步是将2.txt的斜杠也用_代替,否则之后无法输入到文件名中。

var=`sed -n "2,1p" $dir/3.txt | awk '{print $4}'` 取出3.txt的第二行第四列。

mv $dir `dirname $dir`/$var`basename $dir`;#mv命令修改文件夹名。``之间的命令先行运算。dirname和basename是两个内置函数。

done #do循环结束。

希望对你有所帮助。

PS:听了个讲座,浙大睿医的人工智能看起来前景光明,如果可能可以考虑合作。segmentation建议交给影像学及临床医生勾画。祝君好运。

上海迪士尼门口有吃的吗 上海迪士尼哪些好吃的 上海迪士尼乐园孩子门票 上海迪士尼有什么好玩的娱乐项目 上海圣诞节迪士尼烟花时间 三月底去上海迪士尼人多 过年前几天去上海迪士尼人多吗 上海迪士尼乐园 买烟 上海迪士尼冬天半天 上海香港广场迪士尼 南京公园复工 火车公园金华 石桥河公园 游公园写花 王土地公园 石矶湖公园 公园租 疫情期间公园 抚顺公园街道 公园有唱戏