Bash

搜尋具有 CSV 文件中列出的模式的文件夾並將它們複製到另一個位置

  • September 13, 2022

我有數千個文件夾,其中包含文件,我想將其中一些複製到另一個目錄中。我有一個.csv包含兩列的文件,其中包含部分文件夾名稱(文件夾包含一個字元串值或另一個,而不是兩者)。

  • 文件夾名稱範例:
PLASMA_32150129_B5/
PLASMA_AAA3891784_B3/
...
  • CSV 文件沒有標題,欄位由以下分隔,
32150129,AAA0616938
32140203,AAA3891784
32140204,AAA0617237
32140205,AAA0617261
32140206,AAA0617285
...
  • 我發現這個小腳本作為起點:
while IFS=, read -r file rest
do
 find /path/to/Main_directory -type d -name "${file}" -exec cp '{}' /path/to/New_directory/ \;
done < mylist.csv

現在我需要指定

  • csv 值只是一個模式(如*_32150129 _*),並且
  • 我想先嘗試第一列中的模式,如果那不產生匹配,請嘗試另一個。

這可能嗎?

謝謝!

假設實際上只有一個列可以匹配,“或”類型的方法可能是可能的。為此,只需對腳本進行少量修改:

while IFS=, read -r pattern1 pattern2
do
  find /path/to/start -type d \( -name "*_${pattern1}_*" -o -name "*_${pattern2}_*" \) -exec cp -r '{}' /path/to/target \;
done < filelist.csv
  • 操作員將-o確保兩個名稱模式中的任何一個都生成匹配項。只要不是兩者都可以匹配(參見先決條件),這將相當於“第二個,如果第一個不存在”
  • 括號(轉義以防止 shell 解釋)是為了確保正確的運算符優先級。
  • 將 shell 參數-name放在雙引號中將確保*保留字面上的內容而不會被全域擴展(這是必要的,以便find在搜尋期間執行模式匹配,而不是在將其傳遞給之前的 shell )find,同時仍然允許 shell 變數${pattern1}${pattern2}擴大。
  • 如果要複製目錄及其內容,則必須-r選擇 to 。cp

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