Bash
搜尋具有 CSV 文件中列出的模式的文件夾並將它們複製到另一個位置
我有數千個文件夾,其中包含文件,我想將其中一些複製到另一個目錄中。我有一個
.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