我有这个父目录 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 中文件的起始名称与主题子文件夹名称相对应。例如,文件开头为子CDPC0001_ses-01_task-rest_eeg.eeg,类似于文件夹 B 中此特定主题的主题文件夹(子_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 文件夹。我非常感谢您的回答,因为数据很多,手动移动它们很容易出错并且非常乏味。
答案1
首先,安装perlrename
实用程序。您似乎使用的是 Mac,因此您可能需要使用酿造,它已经打包了 perl rename - 请参阅https://formulae.brew.sh/formula/rename。
安装完成后,您应该能够运行如下命令:
$ find A/ -regex '.*_eeg.\(eeg\|vhdr\|vmrk\|json\)' \
-exec rename -n 's=^.*/(sub-[^_]*)_=B/$1/eeg/$1_=' {} +
注意:我不确定find
现在 Mac 上安装的是哪个版本。我假设它是 FreeBSD 的版本find
并且有一个-regex
谓词。如果没有,请brew
安装 GNUfind
并使用它来代替默认的 Mac find
。如果没有,-regex
您可以通过将多个 -name 谓词进行 OR 运算来实现这一点(在括号中以强制优先级):
find A/ \( -name '*_eeg.eeg' -o -name '*_eeg.vhdr' -o -name '*_eeg.vmrk' -o -name '*_eeg.json' \) -exec rename ...`
另请注意,重命名-n
选项使其成为一次试运行,因此它只会显示它将执行的操作,而不会实际重命名任何文件。当您确认它符合您的要求后,请删除-n
,或将其替换为 以获得详细输出。-v
如果重命名脚本不太正确,请修改它,直到它按您想要的方式工作。
顺便说一句,这假设 B/主题/和B/主题/eeg/ 已经存在。如果没有,并且您希望重命名脚本在重命名文件之前创建目录,请在s===
替换操作之前插入以下内容。
if (m=^.*/(sub-[^_]*)_=) { mkdir "B/$1"; mkdir "B/$1/eeg" };
示例运行(只有一个文件名,因为我懒得从您的文件中输入更多文件名)文字图片对于该touch
命令,但它也适用于 .vhdr、.vmrk 和 .json 文件(如果它们存在于我的 A/ 目录中):
$ mkdir -p A B/sub-CDPC0001/eeg/
$ touch A/sub-CDPC0001_ses-01_task-rest_eeg.eeg
$ find A/ -regex '.*_eeg.\(eeg\|vhdr\|vmrk\|json\)' \
-exec rename -v 's=^.*/(sub-[^_]*)_=B/$1/eeg/$1_=' {} +
A/sub-CDPC0001_ses-01_task-rest_eeg.eeg renamed as B/sub-CDPC0001/eeg/sub-CDPC0001_ses-01_task-rest_eeg.eeg