ディレクトリ名を引数として渡して出力ファイルを再帰的に生成する方法は?

ディレクトリ名を引数として渡して出力ファイルを再帰的に生成する方法は?

再帰的なファイルの生成とネストされたサブディレクトリに関連する問題を解決しようとしています。次の入れ子になったディレクトリ構造を作成するコマンドを作成しました。

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

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

親ディレクトリは年を表し、サブディレクトリは番号付き月に対応します。 1月は01、2月は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ファイルの1つ:

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 

秘訣は次のとおりです。パラメータ拡張

おすすめ記事