我有一个文件夹,其中包含三千名受试者的成像数据。每个主题的文件夹中都有许多其他文件夹。我想使用循环从每个子文件夹中提取一个文件,并将它们移动到另一个目录中,并根据患者 ID 重命名它们。例如,/imaging/data/1100232/free surfer/MRI/lh_ribbon.mgz 这里 1100232 文件夹 每个患者的名称都会更改,有三千个患者/文件夹。我想为每个患者提取 lh_ribbon.mgz 文件,并根据患者 ID 重命名该文件。我对 Linux 很陌生,有人可以帮忙吗?谢谢
答案1
由于您是新人,我们将逐步构建此解决方案。
Afind
从中查找所有文件/imaging/
find /imaging/ -iname *.mgz
添加一个-exec \;
以对找到的每个文件执行一次命令(我们将从 开始echo
)(文件名由 表示{}
)
find /imaging/ -iname *.mgz -exec echo {} \;
用于sh -c
允许在-exec
不仅仅是简单命令中使用更复杂的脚本,传入目标目录和发现的文件名 $1 和 $2
find /imaging/ -iname *.mgz -exec sh -c 'echo $1 $2' sh {} "/path/to/store/patient/files/" \; 2>/dev/null
最后从第三个目录中的患者 ID 组成新文件名,并使用新患者 ID 作为文件名从旧位置复制到新位置
find /imaging/ -iname *.mgz -exec sh -c 'p=${1#/*/*/}; p=${p%%/*}; echo cp $1 $2$p.mgz' sh {} "/path/to/store/patient/files/" \; 2>/dev/null
笔记。我将该cp
命令保留为 a,echo
以便您可以在提交之前运行它并查看输出是否正确。如果一切正常那么只需删除echo
然后运行它。