递归地将文件复制到其父目录,并以父目录名称作为文件的前缀

问题描述 投票:0回答:1

我正在尝试将特定文件从当前目录复制到父目录。问题是所有文件都具有相同的名称,因此我需要添加前缀,以便文件在复制后可识别:

目录结构-

  • fs/sub-001/mri/brain.mgz
  • fs/sub-002/mri/brain.mgz

我想要什么-

  • fs/sub-001/sub-001_brain.mgz
  • fs/sub-002/sub-002_brain.mgz

“mri”文件夹及其其他内容可以保持原样。

我尝试过:

find . -type f -name 'brain.mgz' -exec sh -c '
  for file; do
    parentdir=${file%/*}
    parentdir=${parentdir%/*}
    dirname=${parentdir##*/}
    cp "$file" "$parentdir/${dirname_file}${dirname}_${dirname_file}"
  done
' sh {} +

这部分完成了工作。它将文件带出到带有前缀但不带文件扩展名的父目录。所以结果就是——

  • fs/sub-001/sub-001_

看起来文件正在被复制,但没有原始名称和扩展名(没有 Brain.mgz 部分),这违背了目的。

我做错了什么?我相信这与循环中的“cp”命令有关?

linux bash shell
1个回答
1
投票

您正在寻找这样的东西:

find . -type f -name 'brain.mgz' -exec sh -c '
for src; do
  dst=${src%/*/*}
  dst=$dst/${dst##*/}_${src##*/}
  echo cp "$src" "$dst"
done' sh {} +

如果输出看起来不错,则删除

echo

© www.soinside.com 2019 - 2024. All rights reserved.