Bash

如何通過將目錄名稱作為參數傳遞來遞歸地創建輸出文件?

  • September 24, 2020

我正在嘗試解決涉及遞歸文件創建和嵌套子目錄的問題。我編寫了一個命令來創建以下嵌套目錄結構:

   mkdir -p {2019,2020}/{01..03}

   ├── 2019
   │   ├── 01
   │   ├── 02
   │   ├── 03
   ├── 2020
   │   ├── 01
   │   ├── 02
   │   ├── 03

父目錄是一年,子目錄是對應編號的月份,一月是 01,二月是 02 等等。

我試圖弄清楚如何使用這個目錄結構和cal內置函式來遞歸地創建與每個子目錄名稱相對應的日曆年和月的列印文件。預期的輸出將是:

   ├── 2019
   │   ├── 01
   |   |  ├── 01-2019-cal.dat   
   │   ├── 02
   |   |  ├── 02-2019-cal.dat
   │   ├── 03
   |   |  ├── 03-2019-cal.dat
   ├── 2020
   │   ├── 01
   |   |  ├── 01-2020-cal.dat
   │   ├── 02
   |   |  ├── 02-2020-cal.dat
   │   ├── 03
   |   |  ├── 03-2020-cal.dat

例如,對於給定的年份和月份,只執行一次此操作的一個命令是cal 03 2020 > 03-2020-cal.dat. 但是,如何通過將目錄結構本身傳遞給cal並在正確的位置生成正確的輸出來解決這個問題?這是我的命令行技能的絕對極限……我在這裡看到了一些問題的答案,這些問題使用find命令具有相似的元素,但我並不真正理解我正在閱讀的內容。

感謝您提供任何幫助。

如果我對 bash 不太生疏,你可以試試這個:

for d in */*; do 
 cal "${d#*/}" "${d%/*}" > "${d%/*}/${d#*/}/${d#*/}-${d%/*}-cal.dat"
done

假設您在具有年份文件夾的目錄中。

結果是:

├── 2019
│   ├── 01
│   │   └── 01-2019-cal.dat
│   ├── 02
│   │   └── 02-2019-cal.dat
│   └── 03
│       └── 03-2019-cal.dat
├── 2020
│   ├── 01
│   │   └── 01-2020-cal.dat
│   ├── 02
│   │   └── 02-2020-cal.dat
│   └── 03
│       └── 03-2020-cal.dat

cat其中一個文件:

cat 01-2019-cal.dat

輸出(對不起西班牙語版本):

    Enero 2019       
do lu ma mi ju vi sá  
      1  2  3  4  5  
6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30 31 

訣竅是使用參數擴展

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