Command-Line

根據子目錄名稱將特定子目錄中的文件複製到單個目錄中,然後重命名

  • August 24, 2019

所以這是我的目錄樹的摘錄:

|-- 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.

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