复制与另一个位置的另一个文件部分匹配的文件

复制与另一个位置的另一个文件部分匹配的文件

我在这样的目录中有一个 jpeg 文件列表(下面只是一个示例,结构是相同的,但是有很多fo0#子文件夹,不仅是fo01fo01,其中每个子文件夹都有很多.jpeg图像,不仅仅是两个):

.
`-- main
    |-- ccc
    |   |-- fo01
    |   |   |-- ccc_fo01_c_000.jpeg
    |   |   `-- ccc_fo01_c_001.jpeg
    |   `-- fo02
    |       |-- ccc_fo02_c_000.jpeg
    |       `-- ccc_fo02_c_001.jpeg
    |-- ddd
    |   |-- fo01
    |   |   |-- ddd_fo01_d_000.jpeg
    |   |   `-- ddd_fo01_d_001.jpeg
    |   `-- fo02
    |       |-- ddd_fo02_d_000.jpeg
    |       `-- ddd_fo02_d_001.jpeg
    `-- lll
        |-- fo01
        |   |-- lll_fo01_l_000.jpeg
        |   `-- lll_fo01_l_001.jpeg
        `-- fo02
            |-- lll_fo02_l_000.jpeg
            `-- lll_fo02_l_001.jpeg

一些重命名的ccc_foo#_c_###会被手动复制到该ccc目录中。我想要做的是检查这些手动复制的文件,然后分别将等效的d_foo#_d_###和复制到和目录lll_foo#_l_###中。例如,如果我将和复制到该文件夹​​,那么我的脚本应该复制:dddlllccc_fo01_c_001.jpegccc_fo02_c_000.jpegccc

  • ddd_fo01_d_001.jpegddd_fo02_d_000.jpegddd
  • lll_fo01_l_001.jpegl_fo02_l_000.jpeglll

答案1

在bash中:

for x in ccc/*; do
  [ -f "$x" ] || continue                  # skip directories in ccc
  y=${x#*_}                                # strip the ccc_ prefix
  cp -p ddd/*/ddd_"${y/_c_/_d_}" ddd/      # copy the corresponding file under ddd
  cp -p lll/*/lll_"${y/_c_/_l_}" lll/      # ditto under lll
done

该脚本假设您的目录中没有egfo03文件fo01,或者如果您有这些文件,您仍想复制它们。如果不是这种情况,您可能需要调整文件名操作以匹配您的具体情况。

您可能想调查bash的参数扩展特性了解更多信息。

相关内容