我有这个父目录 X 和这两个子目录 A 和 B(见图 1):文件夹 A 包含特定主题的文件,我想将这些文件移动到文件夹 B 中的其他相应文件夹。例如,在文件夹 A 中,我有很多不同主题的文件以不同的扩展名结尾(eeg.eeg、eeg.json、eeg.vhdr 和 eeg.vmrk)(参见照片 2)。
我想为每个主题获取所有这些文件并将它们移动到 B 的子文件夹,其中有一个所有主题的子文件夹:B>>“subject_id”>>ses-t1>>eeg。目标文件夹应该是每个参与者文件夹中的“eeg”文件夹。.
好处是,我认为文件夹 A 中文件的起始名称与主题子文件夹名称相对应。例如,文件以sub-CDPC0001 _ses-01_task-rest_eeg.eeg 开头,类似于文件夹 B ( sub_CDPC0001)中此特定主题的主题文件夹
过去,有一个用于此的迷你脚本,但我认为现在这种安排不能正常工作:
for dir in $(ls -d */ses-t1); do
find "./$dir/" -name '*_eeg.eeg' -exec mv {} "$dir/eeg" \;
find "./$dir/" -name '*_eeg.vhdr' -exec mv {} "$dir/eeg" \;
find "./$dir/" -name '*_eeg.vmrk' -exec mv {} "$dir/eeg" \;
find "./$dir/" -name '*_eeg.json' -exec mv {} "$dir/eeg" \;
#find "./$dir/" -name '*_anat.nii.gz' -exec mv {} "$dir/t1" \;
done
这会列出文件夹 A 中的所有文件,但无法将它们移动到所需的 eeg 文件夹中。非常感谢您的回答,因为有很多数据,手动移动它们很容易出错并且非常繁琐。
首先,安装 perl
rename
实用程序。您似乎使用的是 Mac,因此您可能需要使用brew,它打包了 perl rename - 请参阅https://formulae.brew.sh/formula/rename。安装完成后,您应该可以运行以下命令:
注意:我不确定
find
这些天在 Mac 上安装的是哪个版本。我假设它是 FreeBSD 的版本find
并且有一个-regex
谓词。如果没有,请使用brew
安装 GNUfind
并使用它代替默认的 Macfind
。如果没有-regex
,您可以通过对几个 -name 谓词进行 OR 运算来做到这一点(在括号中强制优先):另请注意,重命名的
-n
选项使其成为空运行,因此它只会显示它会做什么而不会实际重命名任何文件。当您确认它执行您想要的操作时,删除-n
,或将其替换为以获得详细输出。-v
如果它不太正确,请修改重命名脚本,直到它按照您的需要工作。顺便说一句,这假设 B/ subject / 和 B/ subject /eeg/ 已经存在。如果他们不这样做,并且您希望重命名脚本在重命名文件之前创建目录,请在
s===
替换操作之前立即插入以下内容。样本运行(只有一个文件名,因为我懒得从你的命令文本图片中
touch
输入更多文件名,但如果它们存在于我的 A 中,它也可以与 .vhdr、.vmrk 和 .json 文件一起使用/ 目录):