これは私のディレクトリ構造で、最初の2つのディレクトリ名のみに基づいて指定されたディレクトリrevの下の.htmlファイル名を変更したいと思います。これを行うには、コマンドをどのように使用できますか?
prj3
|-- blk1
| |-- blk1.config
| |-- blk1.html
| |-- checklist13
| | |-- checklist13.config
| | |-- checklist13.html
| | |-- checklist13.html~
| | `-- rev2
| | |-- rev2.config
| | `-- rev2.html
| |-- checklist14
| | |-- checklist14.config
| | |-- checklist14.html
| | |-- checklist14.html~
| | `-- rev5
| | |-- rev5.config
| | |-- rev5.html
| | `-- rev5.html~
予想出力:
prj3
|-- blk1
| |-- blk1.config
| |-- blk1.html
| |-- checklist13
| | |-- checklist13.config
| | |-- checklist13.html
| | |-- checklist13.html~
| | `-- rev2
| | |-- rev2.config
| | `--checklist_13_rev2.html
| |-- checklist14
| | |-- checklist14.config
| | |-- checklist14.html
| | |-- checklist14.html~
| | `-- rev5
| | |-- rev5.config
| | |-- checklist_14_rev5.html
| | `-- rev5.html~
rev* フォルダー内のすべての rev*.html ファイルに対してのみ、同じ期待される出力が必要です。
ベストアンサー1
find
basename
以下は、およびの組み合わせを使用する単一のライナーですdirname
。
find . -regex '.*/rev[0-9]+/rev[0-9]+.html' -exec sh -c 'mv -iv {} $(dirname {})/$(basename $(dirname $(dirname {})))_$(basename $(dirname {})).html' \;
デフォルトでは、find regexを使用してrev#/ rev#.htmlで終わるパスを取得し、この組み合わせを使用して新しい名前を構成し、dirname
親basename
ディレクトリと親ディレクトリの親ディレクトリ名を抽出します。