通过Bash将某个文件夹中特定文件复制到另一个文件中

3

总体情况

我正在尝试运行一个脚本,该脚本使用两个输入文件,并针对不同的输入数据运行多次。不修改脚本指定的文件,而是修改相同输入文件的内容,以使脚本保持不变。

特殊情况

我正在运行一个Asymptote脚本(myScript.asy),该脚本从一对文件data.datsteps.dat中获取数据并生成图表。

我需要为位于dataFolder内的几个子文件夹中的多个文件对生成图表。

这些文件对之间可以通过相同的文件名开始且仅在最后一个部分上有所不同进行识别,例如:40x214_cores.dat40x214_times.dat。它们始终位于同一子文件夹中。

目录结构如下:

myScript.asy
data.dat
steps.dat
folderForCharts
dataFolder
  ├ firstSubfolder
  │  ├ AxB_cores.dat
  │  ├ AxB_times.dat
  │  ├ CxD_cores.dat
  │  ├ CxD_times.dat
  │  └ ...
  ├ secondSubfolder
  │  ├ ExF_cores.dat
  │  ├ ExF_times.dat
  │  └ ...
  ├ thirdSubfolder
  │  └ ...

其中A,B,C...是长度不同的数字(最多7位)。

问题

挑战在于创建一个bash循环:

  • 获取一对AxB_cores.datAxB_times.dat的内容,并将它们分别catdata.datsteps.dat中。
  • 运行asymptote脚本:asy myScript -o <output filename>,将输出文件存储在名为"originSubfolderName_AxB"的folderForCharts文件夹中,例如:secondSubfolder_54x6789

然后继续处理下一组文件,涵盖所有文件。

正则表达式用于捕获文件对和子文件夹名称让我感到头晕,所以我有了想法,但不知道如何实现。
谢谢你们抽出时间帮忙。


可能是 https://dev59.com/il4b5IYBdhLWcg3wvkA- 的重复问题。 - tripleee
是和不是,因为有他在那里,他知道文件的数量。拥有 _1 和 _2 后缀的文件是成对出现的,并且还知道它们的开头(只是从 4 到 8 的数字)。我不知道前缀是什么,但它们是相等的,甚至连文件夹中的文件数量也不知道,我猜有超过 80 个。 - onlycparra
我在那个问题下添加了另一个答案。你应该能够找到许多其他类似的问题,并且有很好的答案。 - tripleee
1个回答

1
以下脚本是否符合您的要求?
#!/bin/bash

find . -type f -name '*cores.dat' | while read f
do
    g=${f/cores/times}
    if [ -r "$f" -a -r "$g" ] ; then
      dir=$(dirname "$f")
      axb=$(basename "$f")
      axb=${axb/_cores.dat/}
      echo "process $f and $g with dir=$dir and axb=$axb"
    else
      echo "Cannot find $g" >&2
    fi
done

现在不在家,几个小时后我会测试它,谢谢你的帮助 :) - onlycparra
它的工作效果非常棒,只需要在问题部分的第二点中的“then”部分进行一些微调即可:以某种方式获取字符串subfolderName_AxB。其中,subfolderName是找到文件$f$g的子文件夹的名称,AxB$f$g的公共前缀。我该如何获取该字符串?(用于我的脚本输出名称)。谢谢 - onlycparra
@onlycparra - 我已经添加了那些额外的细节。根据您的具体情况,您可能还想修改find命令或添加grep过滤器。您也可能想要稍微了解一下bash...我认为您会发现它值得花费时间! - peak
太好了,我进行了一些小修改,因为我只需要文件夹的名称而不是完整路径。 - onlycparra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接