ファイルとその親ディレクトリを作成する


19

私はtouchコマンドがファイルを作成することを知っています:

touch test1.txt

しかし、どのようにファイルとそのフルパスを作成できますか?

たとえば、私のデスクトップには何も含まれていません:

~/Desktop/$ ls
~/Desktop/$

で1.txtを作成したい~/Desktop/a/b/c/d/e/f/g/h/1.txt。次のような簡単なコマンドでこれを実行できますか?

$ touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt

絶対パスを手動で作成してからファイルを作成する代わりに?

回答:


23

touchディレクトリを作成できませんmkdir。そのために必要です。

ただし、完全なディレクトリ構造を作成するmkdir便利な-p/ --parentsオプションがあります。

からman mkdir

   -p, --parents
          no error if existing, make parent directories as needed

したがって、特定の状況で必要なコマンドは次のとおりです。

mkdir -p ~/Desktop/a/b/c/d/e/f/g/h/ && touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt

これがより頻繁に必要になり、毎回2回パスを入力したくない場合は、Bash関数またはそのためのスクリプトを作成することもできます。

  • Bash関数(この行を追加~/.bashrcして、ユーザーが利用できるようにします。そうしないと、ターミナルを終了すると再び消えます):

    touch2() { mkdir -p "$(dirname "$1")" && touch "$1" ; }
    

    次のように簡単に使用できます。

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Bashスクリプト(/usr/local/bin/touch2sudoを使用して保存し、すべてのユーザーが使用できるようにします。それ以外の~/bin/touch2場合はユーザーのみが使用できるようにします):

    #!/bin/bash
    mkdir -p "$(dirname "$1")" &&
        touch "$1"
    

    を使用してスクリプトを実行可能にすることを忘れないでくださいchmod +x /PATH/TO/touch2

    その後、次のように実行することもできます。

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    

元のtouch コマンドを編集-pしてスイッチを追加できますか?
MAヘシュマットカー

3
@HeshmatKhah可能性はありますが、システムの実行可能ファイルを独自のスクリプトまたは関数でシャドウイングすることはお勧めしません。"p"を好む場合、のtouch-p代わりに名前(スペースなし!)を使用できますがtouch2、元のコマンドを置き換えることはしません。
バイトコマンダー

1
あなたが代わりのサフィックスの除去を使用できることに注意してくださいdirnameだけでなく、あなたができる、つまりmkdir -p "${1%/}" && touch "$1"、同じaskubuntu.com/a/928544/295286
Sergiy Kolodyazhnyy

7

フラグinstall付きのコマンドを使用できます-D

bash-4.3$ install -D /dev/null mydir/one/two

bash-4.3$ tree mydir
mydir
└── one
    └── two

1 directory, 1 file
bash-4.3$ 

複数のファイルがある場合は、アイテムのリストを使用して(スペースでアイテムを引用することを忘れないでください)、それらを繰り返し処理することを検討します。

bash-4.3$ for i in mydir/{'subdir one'/{file1,file2},'subdir 2'/{file3,file4}} ; do 
> install -D /dev/null "$i"
> done
bash-4.3$ tree mydir
mydir
├── one
│   └── two
├── subdir 2
│   ├── file3
│   └── file4
└── subdir one
    ├── file1
    └── file2

または、配列を使用する場合:

bash-4.3$ arr=( mydir/{'subdir one'/{file1,file2},'subdir 2'/{file3,file4}} )
bash-4.3$ for i in "${arr[@]}"; do  install -D /dev/null "$i"; done
bash-4.3$ tree mydir
mydir
├── one
│   └── two
├── subdir 2
│   ├── file3
│   └── file4
└── subdir one
    ├── file1
    └── file2

このアプローチでは、新しいファイルはデフォルトで実行可能権限を取得します。タッチで取得するのと同じ権限を付与するには、次を使用できますinstall -m 644 -D /dev/null <filepath>
ricab

1

この目的のために、以下の例のように独自の関数を作成できます。

$ echo 'mkfile() { mkdir -p "$(dirname "$1")" && touch "$1" ;  }' >> ~/.bashrc
$ source ~/.bashrc
$ mkfile ./fldr1/fldr2/file.txt

まず、echoコマンドを使用して〜/ .bashrcファイルの最後に関数を挿入します。関数の-pフラグを使用すると、この例のfldr2などのネストされたフォルダーを作成できます。最後に、sourceコマンドでファイルを更新し、最終的に最近作成されたmkfileコマンドを実行します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.