我有一个文件夹,里面有三千名受试者的影像数据。每个主题的文件夹中都有许多其他文件夹。我想使用一个循环从每个子文件夹中提取一个文件,并将它们移到另一个目录中,并根据病人ID重命名它们。例如,/imaging/data/ 1100232 /free surfer/MRI/lh_ribbon.mgz,这里为每个病人更改了1100232个文件夹名,并且有3000个病人/文件夹。我想提取每个病人的lh_ribbon.mgz文件,并根据病人iD重命名这个文件。我对Linux很陌生,有人能帮忙吗?谢谢
发布于 2019-07-14 10:03:48
由于您是新来的,我们将逐步构建此解决方案。
一个find来定位/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命令保留为echo,这样您就可以运行它,并在提交之前确保输出是正确的。如果一切正常,那么只需删除echo,然后运行它。
https://unix.stackexchange.com/questions/528764
复制相似问题