我有一个父目录X和这两个子目录A和B(见图1):

文件夹A包含特定主题的文件,我想要移动到文件夹B中更多的对应文件夹中。例如,在文件夹A中,我有很多以不同扩展名(eeg.eeg、eeg.json、eeg.vhdr和eeg.vmrk)结尾的不同主题的文件(参见图2)。

我想把每个主题的所有这些文件移到B的子文件夹中,在那里所有的主题都有一个子文件夹:B>>“subject_id”>>es-T1>>eeg。目标文件夹应该是每个参与者文件夹中的"eeg“文件夹。

。
所需结果应如下图所示(图3):

好的是,我认为,文件夹A中文件的起始名称与subject子文件夹名称相对应。例如,文件以子with 0001_es-01_task_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文件夹。我将非常感谢一个答案,因为有很多数据,而手动移动它们很容易出错,而且非常乏味。
发布于 2022-11-11 16:06:53
首先,安装perl rename实用程序。您似乎使用的是Mac,所以您可能需要使用酿制,它有perl重命名打包-参见https://formulae.brew.sh/formula/rename。
一旦安装好它,您应该能够运行以下内容:
$ find A/ -regex '.*_eeg.\(eeg\|vhdr\|vmrk\|json\)' \
-exec rename -n 's=^.*/(sub-[^_]*)_=B/$1/eeg/$1_=' {} +注意:我不确定这些天在Mac上安装了哪个版本的find。我假设它是FreeBSD版本的find,并有一个-regex谓词。如果不是,请使用brew安装GNU find,而不是默认的find。如果没有-regex,您可以通过将几个-name谓词放在一起(在括号中强制优先级)来实现:
find A/ \( -name '*_eeg.eeg' -o -name '*_eeg.vhdr' -o -name '*_eeg.vmrk' -o -name '*_eeg.json' \) -exec rename ...`还请注意,rename的-n选项使它成为一个尝试运行,因此它将只显示它将做什么,而不实际重命名任何文件。删除-n,或者用-v替换它以获得详细的输出,当您确认它可以做您想做的事情时。如果重命名脚本不太正确,就修改它,直到它按照您的要求工作为止。
顺便说一下,这假设B/subject/和B/subject/eeg/已经存在。如果它们不需要,并且您希望重命名脚本在重命名文件之前创建目录,那么在s===替换操作之前插入以下内容。
if (m=^.*/(sub-[^_]*)_=) { mkdir "B/$1"; mkdir "B/$1/eeg" };示例运行(只有一个文件名,因为我不介意在文字图片中为touch命令输入更多的文件名,但如果A/目录中存在这些文件,那么它们也可以用于.vhdr、.vmrk和.json文件):
$ 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.eeghttps://unix.stackexchange.com/questions/724482
复制相似问题