如何提取数千个文件,其中每个文件位于单独的子文件夹中?

如何提取数千个文件,其中每个文件位于单独的子文件夹中?

我有一个文件夹,其中包含三千名受试者的成像数据。每个主题的文件夹中都有许多其他文件夹。我想使用循环从每个子文件夹中提取一个文件,并将它们移动到另一个目录中,并根据患者 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然后运行它。

相关内容