touchでmkdir -pも行いたい


touchでディレクトリをほってファイルを作成することは出来ますか?

`/var/www/html/index.html`を作りたい時に`/var/www/`までしかディレクトリがない場合にいちいちディレクトリを作るのがめんどくさいです。

1回のコマンドで簡単に済ませる方法があれば教えて下さいな




`install -D /dev/null /var/www/html/index.html`

* * *

## 追記: このコマンドは既にあるファイルを上書きします(!)

`--backup`オプションで退避させる事もできますが、touchと同じ効果を期待するなら他の回答のように `mkdir` と `touch`
を組み合わせたほうが良いと思います。

### 本当に欲しかったもの

`sh -c 'mkdir -p "$(dirname "$0")" && touch "$0"' /var/www/html/index.html`

### 解説

  * `sh -c <command> <args...>`  
既存のセッションに非ログイン/非インタラクティブなshのプロセスを作成し、`<command>`を実行します。 /bin/sh は Ubuntu で
dash 、 CentOS だと bash になりますので、コマンドは bourne-shell で書くのが良いかと思います。外側の `<args...>`
はそれぞれ `<command>` 中の `$0`, `$1` ... に代入されます。

  * `dirname <arg>`  
`<arg>` に渡された文字列をファイルパスとしてそのディレクトリを参照します。 `<arg>`
には空白やグロブ(`*`等)が含まれる可能性があるため、ダブルクォートで括ります。

  * `$(<command>)`  
`<command>`を実行し、その標準出力を文字列とします。古いbourne-
shellではバッククォートで書く必要がありましたが、昨今はPOSIXに準拠したシェルであれば基本的に広く使えると考えてかまわないでしょう。バッククォートでも書けなくはないですが、内側の
`"` をエスケープする必要があります。

  * `mkdir -p <arg>`  
ご存知の通りです。 `<arg>`に空白が含まれる可能性があるのでダブルクォートでくくります。

  * `&&`  
`mkdir` が失敗した時に `touch` が実行されてしまわないよう短絡評価にします。コマンド実行前に
`/var/www/html/index.html/` という **ディレクトリ** が存在した場合、 `mkdir -p` は失敗するでしょう。

  * `touch "$0"`  
shコマンドで渡されていた引数で `touch` します。

