別の場所にある他のファイルと部分的に一致するファイルのコピー

別の場所にある他のファイルと部分的に一致するファイルのコピー

次のディレクトリにjpegファイルのリストがあります。以下は単なる例であり、構造は同じですが、同様にfo0#多くのサブフォルダがあります。各サブフォルダには2つではなく、多くの画像があります。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.jpegそしてddd
  • lll_fo01_l_001.jpegl_fo02_l_000.jpegそしてlll

答え1

バッシュから:

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

このスクリプトは、たとえば、ディレクトリにfo03ファイルがないfo01場合やファイルがある場合は、まだコピーしたいとします。そうでない場合は、特定の状況に合わせてファイル名の操作を調整する必要があります。

調査したいかもしれませんBashのパラメータ拡張機能より多くの情報を知りたいです。

関連情報