【问题标题】:for each pair of files with the same prefix, execute code对于每对具有相同前缀的文件,执行代码
【发布时间】:2018-01-16 00:06:10
【问题描述】:

我有一个很大的目录列表,每个目录都包含不同数量的“配对”文件。通过配对,我的意思是两个文件的前缀相同,并且这些对表示为“a”和“b”。前缀也不遵循定义的模式。我更广泛的意图是编写一个 bash 脚本,该脚本将列出给定目录中的所有子目录,cd 进入每个目录,找到文件对,并在这些文件对上执行一个函数。这是一个示例目录:

Dir1
    123_a.txt
    234_a.txt
    123_b.txt
    234_b.txt

Dir2
    345_a.txt
    345_b.txt

Dir3
    456_a.txt
    567_a.txt
    678_a.txt
    456_b.txt
    567_b.txt
    678_b.txt

我可以使用这段代码循环思考每个目录:

for d in ./*/ ; do (cd "$d" && script.sh); done

在 script.sh 中,我一直在编写一个脚本来查找所有文件对(这是我正在努力解决的问题),然后调用我想要应用于这些文件的函数。这是我一直在尝试的要点:

for file in ./*_a.txt; do (find the paired file with *_b.txt && run_function.sh); done

我将问题分解为需要获取 _a.txt 文件的“*”值,然后使用该值在目录中搜索匹配的 _b.txt 后缀,并创建一个可以将它们放入的子目录所以我可以应用run_function.sh。所以 Dir1 将包含子目录 123 和 234。

如果这没有意义,请告诉我。我正在努力解决的部分问题是匹配没有定义前缀的文件。

感谢您的帮助。

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    使用参数扩展:

    #!/bin/bash
    file=123_a.txt
    prefix=${file%_a.txt}  # remove _a.txt from the right
    second=${prefix}_b.txt
    if [[ -f $second ]] ; then
        run_function "$file" "$second"
    fi
    

    【讨论】:

    • 可以在不需要明确定义 file = 的情况下做到这一点吗?我可以将其动态命名为 ./*_a.txt 吗?
    • @Phil_T 当然。 for 循环为您完成分配,您可以随意使用此代码:)
    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2017-07-16
    相关资源
    最近更新 更多