如何通过传递目录名称作为参数来递归创建输出文件?

如何通过传递目录名称作为参数来递归创建输出文件?

我正在尝试解决涉及递归文件创建和嵌套子目录的问题。我编写了一个命令来创建以下嵌套目录结构:

    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命令具有类似元素的问题的答案,但我并不真正理解我正在阅读的内容。

感谢您提供任何帮助。

答案1

如果我对 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 

诀窍是使用参数扩展

相关内容