ファイルの場合はmkdir -p


24

mkdir -pディレクトリを作成します。また、必要に応じて親ディレクトリを作成します。

必要に応じてファイルと親ディレクトリを作成する、同様のコマンドがファイルに存在しますか?


私が気づいているわけではありませんが.. mkdir -p / path / to / make && touch / path / to / file ...するだけで、必要に応じて作成した新しいディレクトリ構造に空のファイルが作成されます。

1
それを組み合わせ@Kansha dirnamebasename、我々は単一の引数を必要とするだけでしょう。利益!:)

そう、いい電話。

回答:


29

ソースファイルが指定されている場合、インストールはこれを行います/dev/null-D引数はすべて、親ディレクトリを作成するにはこう述べています。

anthony@Zia:~$ install -D /dev/null /tmp/a/b/c
anthony@Zia:~$ ls -l /tmp/a/b/c 
-rwxr-xr-x 1 anthony anthony 0 Jan 30 10:31 /tmp/a/b/c

それがバグかどうかはわかりません。デバイスファイルでの動作はマンページに記載されていません。また、空のファイル(mktempたとえば、で新しく作成されたもの)をソースとして指定することもできます。


7

いいえ、私の知る限りではありません。しかし、あなたはいつでも使用することができますmkdir -pし、touchお互いの後に:

f="/a/b/c.txt"
mkdir -p -- "${f%/*}" && touch -- "$f"

3

私はこのような状況に頻繁に遭遇したので、.bashrcファイルに関数を書いただけです。こんな感じ

function create() {
    arg=$1
    num_of_dirs=$(grep -o "/" <<< $arg | wc -l)
    make_dirs=$(echo $arg | cut -d / -f1-$num_of_dirs)
    mkdir -p $make_dirs && touch $arg
}

したがって、存在しないディレクトリのパス内にファイルを作成したい場合は、

create what/is/it  # will create dirs 'what' and 'is', with file 'it' inside 'is'

1
私の男!-ありがとう、私はそれを呼び出したtouchp、例えばmkdir -p
生態学的な

0
dir=$(dirname "$f")
test -d $dir || mkdir -p "$dir"

3
test必要ありません。mkdir -pdirが既に存在する場合は何もしません。エラーを返しません。
デロバート

1
そしてもちろん、これはディレクトリを作成するだけです。
CVn

0

変数を個別に設定すると、変数を変更して、履歴からコマンドを簡単に再実行できるようになりますが、1行に保持することをお勧めします。

B="./make/this/path" && mkdir -p -- "$B" && touch -- "$B/file.txt"

0

「偽造」することは可能です。

まず、いくつかの必要な理論:

Rob Griffithsは2007年にMacworld.com に「たくさんの新しいフォルダー簡単に作成」という記事を投稿xargsしましたmkdir

xargsに渡される各引数の値を含むフラグでplaceholder{})を参照できます。そのフラグがある場合とない場合の違いは次のとおりです。-Ixargs

$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt

xargssh -cフラグを使用して任意のシェルコマンドを実行することもできます。

foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'

概念の組み合わせ:

私たちは、これらの概念とを組み合わせることができmkdir -p代わりのmkdirとでは考え方@ldx答えは、これを生成します:

$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'

このコマンドは、基本的には、ファイルの行で区切られたリスト内の各ファイル名は、ファイルの一部をオフチョップ、とディレクトリを作成マッピングしmkdir -p、その後、touchそれのそれぞれのディレクトリにあるファイル名をES。

上記のコマンドで発生することの内訳は次のとおりです。

たとえば、私のfiles.txt見た目は次のようになります。

deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
  • cat files.txt 生産する deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt
  • deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt にパイプされます xargs
  • を使用したため-I {}xargs各引数は独自のコマンドに変換されるため、次のようになります。
    • deeply/nested/foo/bar.txt
    • deeply/nested/baz/fiz.txt
  • 次に、&&コンビネーターを使用して順次実行する3つのコマンドをグループ化するシェルコマンドを実行します。最初のコマンドは、以前に登録したプレースホルダーを使用して環境変数(次のファイルパスで再利用)にファイルを保存します。持ってる:
    • f=deeply/nested/foo/bar.txt
    • f=deeply/nested/baz/fiz.txt
  • これでに渡すことができる変数ができましたがmkdir -p、ファイル名を切り取る必要があります。使用して十分に簡単'${f%/*}'
    • mkdir -p deeply/nested/foo/
    • mkdir -p deeply/nested/baz/
  • そして、次のf場合に変数全体を再参照しますtouch
    • touch deeply/nested/foo/bar.txt
    • touch deeply/nested/baz/fiz.txt

2
あなたは本質的には何のためにこのすべて、について説明がありcat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'、UUOCを持っている、あなたはとき、バックシェルにサブシェルxargsのにサブシェルwhile readループは、より理にかなって
スティーヴン・ペニー

1
私は* nixコマンドに最も精通していないことを認めます-UUOCが何であるかさえ知りません-しかし、これがどのようにひどい答えであるかはわかりません。それは調査され、テストされ、元の質問に対する有効なソリューションです。それは建設的です(あなたのむしろ失礼なコメントとは異なります)。ここで私がしてはいけない無責任なことをしたと感じたら、さらに詳しく説明してください- 理由を説明してください。実質を持たない意見交換の議論にはあまり関心がありません。
剃刀ひげ

1
私の最後のコメントはそれを完璧に説明しています。あなたの全体の答えは、のように書く方が良いでしょうwhile read f; do mkdir -p "$(dirname "$f")"; touch "$f"; done < files.txt。あなたはUUOCのために10秒のインターネット検索を行う傾けるということも言っている
スティーヴン・ペニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.