如何根据文件夹名称对应移动文件?

如何根据文件夹名称对应移动文件?

我有这个父目录 X 和这两个子目录 A 和 B(参见照片 1):在此输入图像描述文件夹 A 包含特定主题的文件,我想将这些文件移动到文件夹 B 中进一步对应的文件夹。例如,在文件夹 A 中,我有很多不同主题的文件,这些文件以不同的扩展名结尾(eeg.eeg、eeg.json、 eeg.vhdr 和 eeg.vmrk)(参见照片 2)。在此输入图像描述

我想获取每个主题的所有这些文件并将它们移动到 B 的子文件夹中,其中有一个用于所有主题的子文件夹:B>>“subject_id”>>ses-t1>>eeg。目标文件夹应该是每个参与者文件夹中的“eeg”文件夹。在此输入图像描述

期望的结果应如下图所示(图 3): 在此输入图像描述

我认为,好处是文件夹 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

相关内容