Bash

複製與另一個位置的另一個文件部分匹配的文件

  • March 12, 2015

我在這樣的目錄中有一個 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_###``ddd``lll``ccc_fo01_c_001.jpeg``ccc_fo02_c_000.jpeg``ccc

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

在 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

該腳本假定您的目錄中沒有例如fo03文件fo01,或者如果您確實有這些文件,則無論如何您都想複製它們。如果不是這種情況,您可能需要調整文件名操作以匹配您的確切情況。

您可能需要研究bash 的參數擴展功能以獲取更多資訊。

引用自:https://unix.stackexchange.com/questions/189833