按目录分支/叶子对文件进行分组

发布于 2024-10-30 05:24:44 字数 1004 浏览 1 评论 0原文

我是 bash 新手,在处理目录树结构时遇到困难。 我的目录结构如下

I/A/dataA.dat
I/B/dataB.dat
I/C/dataC.dat

II/A/dataA.dat
II/B/dataB.dat
II/C/dataC.dat

III/A/dataA.dat
III/B/dataB.dat
III/C/dataC.dat

我现在想要使用 I/B/dataB.dat 处理 I/A/dataA.dat 以及同样的 II/ A/dataA.datII/B/dataB.dat 等(对于每种情况)。但我不想用 II/B/dataB.dat 处理例如 I/A/dataA.dat

查找此类文件对的最佳方法是什么?

我希望将找到的文件对的名称传递给 bash 函数,如下所示,

function process_pair()
{
  fileOne=$1; #for example II/A/data.dat
  fileTwo=$2; #for example II/B/data.dat
  //the rest of the function that processes this pair.
}

但我不知道如何获取变量 $1$2

我目前正在使用 bash 并从 dirs=find $SOURCE -type d -links 2 命令开始(查找所有叶目录 - 改编自这个问题)。然后我尝试循环这些(使用子字符串命令来获取上面的目录)。 但是,我发现这很困难,我认为必须有更好的方法。

I am new to bash and am having difficulty processing directory tree structures.
I have a directory structure that is as follows

I/A/dataA.dat
I/B/dataB.dat
I/C/dataC.dat

II/A/dataA.dat
II/B/dataB.dat
II/C/dataC.dat

III/A/dataA.dat
III/B/dataB.dat
III/C/dataC.dat

I now want to process I/A/dataA.dat with I/B/dataB.dat and likewise II/A/dataA.dat with II/B/dataB.dat etc (for every case). But I do not want to process, for example, I/A/dataA.dat with II/B/dataB.dat.

What is the best way to find such pairs of files?

I wish to pass the names of the found pair to a bash function such as follows

function process_pair()
{
  fileOne=$1; #for example II/A/data.dat
  fileTwo=$2; #for example II/B/data.dat
  //the rest of the function that processes this pair.
}

but I do not know how to get the variables $1 and $2.

I am currently using bash and starting from the dirs=find $SOURCE -type d -links 2 command (to find all the leaf directories - adapted from this question). I am then trying to loop over these (using substring commands to obtain the directory above).
However, I am finding this difficult and I think there must be a better way.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

耶耶耶 2024-11-06 05:24:44

在 shell 中很容易完成:

for dir in I II III; do
    subdirs=()
    for subdir in $dir/*; do subdirs+=("${subdir##*/}"); done
    for (( i=0 ;i<${#subdirs[*]}-1; i++ ));  do
        for (( j=i ;j<${#subdirs[*]} ;j++ ));  do
            a=${subdirs[$i]}
            b=${subdirs[$j]}
            process_pair $dir/$a/data$a.dat $dir/$b/data$b.dat
        done
    done
done

Readily done in the shell:

for dir in I II III; do
    subdirs=()
    for subdir in $dir/*; do subdirs+=("${subdir##*/}"); done
    for (( i=0 ;i<${#subdirs[*]}-1; i++ ));  do
        for (( j=i ;j<${#subdirs[*]} ;j++ ));  do
            a=${subdirs[$i]}
            b=${subdirs[$j]}
            process_pair $dir/$a/data$a.dat $dir/$b/data$b.dat
        done
    done
done
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文