Bash

遍歷許多文件夾並在 bash 中使用具有相似模式的文件進行計算

  • February 12, 2019

我有幾個文件夾,每個文件夾都包含幾個.nc文件。我想遍歷所有文件夾,並為每個文件夾使用cdo具有相似模式的文件進行一些計算(合併時間)。到目前為止,我已經寫了以下內容:

for dir in /mnt/meteo_a/africa_cordex/historical/0.44/pr/*/     
do 
dir=${dir%*/}
echo ${dir##*/} 
export dir
cd $dir
pwd
 for f in `find . -type f -regex /(.*?\day)/*`
 cdo mergetiem io
 done
done

每個文件夾中的文件具有如下名稱:

pr_AFR-44_CNRM-CERFACS-CNRM-CM5_historical_r1i1p1_CLMcom-CCLM4-8-17_v1_day_19500101-19501231.nc
pr_AFR-44_CNRM-CERFACS-CNRM-CM5_historical_r1i1p1_CLMcom-CCLM4-8-17_v1_day_19510101-19551231.nc
pr_AFR-44_ICHEC-EC-EARTH_historical_r12i1p1_CLMcom-CCLM4-8-17_v1_day_19491201-19501231.nc
pr_AFR-44_ICHEC-EC-EARTH_historical_r12i1p1_CLMcom-CCLM4-8-17_v1_day_19510101-19551231.nc

我想對之前具有相似模式的所有文件應用 mergetime CDO 命令_day_

我想合併前兩個文件和後兩個文件。更具體地說,合併以

"pr_AFR-44_CNRM-CERFACS-CNRM-CM5_historical_r1i1p1_CLMcom-CCLM4-8-17_v1_" 

同樣合併以

"pr_AFR-44_ICHEC-EC-EARTH_historical_r12i1p1_CLMcom-CCLM4-8-17_v1"

合併時間的輸出可能類似於:

{pattern}_mergetime.nc 

此腳本片段適用於您的範例文件

for file in *.nc
do 
   echo "$file"
done | sed 's/_day_.*//' | sort -u | while read -r pattern
do
   cdo mergetime "${pattern}"* "${pattern}_mergetime.nc"
done

解釋:

  • for循環每行echo列印一個文件名。
  • sed命令刪除_day_所有後續字元。
  • sort -u對部分文件名進行排序並刪除重複項。
  • while read -r pattern每行讀取一個模式並在模式上循環
  • "${pattern}"*由 shell 擴展為以模式開頭的所有文件名

比可能的for循環更好echo

find . -maxdepth 1 -type f -name '*.nc'

這將列印*.nc目前目錄中匹配的所有文件名,不包含子目錄。

您可以將其與類似於問題中腳本的所有子目錄的循環結合使用

for dir in /mnt/meteo_a/africa_cordex/historical/0.44/pr/*/     
do 
   dir=${dir%*/}
   echo ${dir##*/} 
   export dir
   pushd $dir
   pwd

   find . -maxdepth 1 -type f -name '*.nc' | sed 's/_day_.*//' | sort -u | while read -r pattern
   do
       cdo mergetime "${pattern}"* "${pattern}_mergetime.nc"
   done

   popd
done

而不是cd我建議pushd允許popd稍後返回。

您還可以for將目錄上的循環替換為額外的find

find /mnt/meteo_a/africa_cordex/historical/0.44/pr -maxdepth 1 -mindepth 1 -type d | while read dir
do
   pushd "$dir"

   find . -maxdepth 1 -type f -name '*.nc' | sed 's/_day_.*//' | sort -u | while read -r pattern
   do
       cdo mergetime "${pattern}"* "${pattern}_mergetime.nc"
   done

   popd
done

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