AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 724482
Accepted
lotus
lotus
Asked: 2022-11-12 04:53:32 +0800 CST2022-11-12 04:53:32 +0800 CST 2022-11-12 04:53:32 +0800 CST

如何根据名称与文件夹的对应关系移动文件?

  • 772

我有这个父目录 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 中文件的起始名称与主题子文件夹名称相对应。例如,文件以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 文件夹中。非常感谢您的回答,因为有很多数据,手动移动它们很容易出错并且非常繁琐。

linux
  • 1 1 个回答
  • 26 Views

1 个回答

  • Voted
  1. Best Answer
    cas
    2022-11-12T08:06:53+08:002022-11-12T08:06:53+08:00

    首先,安装 perlrename实用程序。您似乎使用的是 Mac,因此您可能需要使用brew,它打包了 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/ 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.eeg
    
    • 0

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve