Command-Line
根據子目錄名稱將特定子目錄中的文件複製到單個目錄中,然後重命名
所以這是我的目錄樹的摘錄:
|-- 20070214_014700.a | |-- info | |-- processed | |-- HH.EL..BHZ | |-- AZ.AS..HHZ | |-- (hundreds more) | |-- raw | |-- resp |-- 20100737_055560.a | |-- info | |-- processed | |-- raw | |-- resp |-- 20190537_028750.a | |-- info | |-- processed | |-- raw | |-- resp
我有大約 13,000 個目錄(以 .a 結尾),每個目錄都有一個“已處理”子目錄,其中包含我想從每個已處理/目錄複製到單個目錄中的文件。其中一些文件可能具有相同的文件名,因此我還想根據它們的父目錄重命名它們。我不太挑剔,但類似於:
20070214_014700_HH.EL..BHZ
整個數據集為 3 TB,所以我一直在使用“查找”對幾個目錄進行測試:
find . -name processed -exec cp -r '{}' 'test/{}' \;
由於某種原因,這會將一些文件轉儲到 test/ 中,但還會在其中創建另一個已處理 / 目錄。我不確定如何將複製命令和重命名功能同時包含在 find 中,所以任何建議都會很棒。謝謝您的幫助。
find . -type f -path "./*.a/processed/*" -exec sh -c ' for path; do prefix=${path%%.a/processed*} cp "$path" "test/${prefix##*/}_${path##*processed/}" done ' sh {} +
選項
-type f
在給定路徑中搜尋正常文件,並且該選項以’ 結果作為參數 ( )-exec
啟動一個 shell 腳本。在-loop 中,每個參數都分配給變數。find``{} +``for``path
範例:如果變數
path
為./20070214_014700.a/processed/AZ.AS..HHZ
,則
prefix=${path%%.a/processed*}
刪除後綴 ->./20070214_014700
${prefix##*/}
刪除第一個前綴/
->20070214_014700
${path##*processed/}
還刪除前綴並保留文件名 ->AZ.AS..HHZ
該
cp
命令的結果目標文件名是test/20070214_014700_AZ.AS..HHZ
.