首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据与文件夹的名称通信来移动文件?

如何根据与文件夹的名称通信来移动文件?
EN

Unix & Linux用户
提问于 2022-11-11 12:53:32
回答 1查看 83关注 0票数 0

我有一个父目录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)中的主题文件夹。

在过去,曾有一个用于此的迷你脚本,但我认为这种安排目前无法正常工作:

代码语言:javascript
复制
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文件夹。我将非常感谢一个答案,因为有很多数据,而手动移动它们很容易出错,而且非常乏味。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-11-11 16:06:53

首先,安装perl rename实用程序。您似乎使用的是Mac,所以您可能需要使用酿制,它有perl重命名打包-参见https://formulae.brew.sh/formula/rename

一旦安装好它,您应该能够运行以下内容:

代码语言:javascript
复制
$ 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谓词放在一起(在括号中强制优先级)来实现:

代码语言:javascript
复制
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===替换操作之前插入以下内容。

代码语言:javascript
复制
if (m=^.*/(sub-[^_]*)_=) { mkdir "B/$1"; mkdir "B/$1/eeg" };

示例运行(只有一个文件名,因为我不介意在文字图片中为touch命令输入更多的文件名,但如果A/目录中存在这些文件,那么它们也可以用于.vhdr、.vmrk和.json文件):

代码语言:javascript
复制
$ 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
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/724482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档