

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

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

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


CC BY-SA 3.0
2016-02-04T22:25:31.503
21718
2019-10-11T01:20:31.870
9149
question
linux
touchでmkdir -pも行いたい


こんなんでいかがですか。.bashrcとかに入れてください

[code]

    dirtouch() {
        mkdir -p "$(dirname $1)"
        touch "$1"
    }
    alias touch=dirtouch
    
[/code]

編集: スペース対策のクォート


CC BY-SA 3.0
2016-02-04T22:56:23.190
21719
2016-02-04T23:40:08.700
2016-02-04T23:40:08.700
7837
7837
21718
answer


`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` します。


CC BY-SA 4.0
2016-02-04T23:13:13.757
21720
2019-10-11T01:13:54.613
2019-10-11T01:13:54.613
62
62
21718
answer


以下にすれば複数のパスに対応できます。  
`dirtouch test/{a,b}.txt`でも使える。

[code]

    dirtouch() {
        for i in "$@"
        do
            mkdir -p $(dirname "$i")
            touch "$i"
        done
    }
    
[/code]

(アカウントの信用度が低いので別コメントとして回答)


CC BY-SA 4.0
2019-10-08T22:32:59.257
59582
2019-10-10T17:25:33.843
2019-10-10T17:25:33.843
36129
36129
21718
answer


[kebabu_wrap](https://ja.stackoverflow.com/users/36129/kazuhiro-
sakurayama)さんの[回答](https://ja.stackoverflow.com/a/59582/25936)の発展形です。  
手元では`-h`とか`--date`などの引数を使うのでそれらを無視するようにしました。

[code]

    touch () {
        for arg in "$@"; do
            case "$arg" in
                -d|-r|-t) next="skip"; continue ;;
                      -*) continue ;;
                       *) test "$next" = "skip" && { unset next; continue; } ;;
            esac
            mkdir --parent "$(dirname "$arg")"
        done
        command -p touch "$@"
    }
    
[/code]


CC BY-SA 4.0
2019-10-09T13:31:11.993
59602
2019-10-11T01:20:31.870
2019-10-11T01:20:31.870
36129
25936
21718
answer