Bash
遍歷許多文件夾並在 bash 中使用具有相似模式的文件進行計算
我有幾個文件夾,每個文件夾都包含幾個
.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