すべてのサブディレクトリにディレクトリを作成するにはどうすればよいですか?


34

次のようなディレクトリ構造があるとします。

$ [〜/ practice] ls
あいうえお/

今、私tmp1はすべてのサブディレクトリにディレクトリを作成したいので、practiceこれを行います:

$ [〜/ practice] mkdir * / tmp1
mkdir:ディレクトリ `* / tmp1 'を作成できません:そのようなファイルまたはディレクトリはありません

次に、-pスイッチを試し*て、サブディレクトリという名前のディレクトリになりますtmp1

$ [〜/ practice] mkdir -p * / tmp1

$ [〜/ practice] ls
*/ あいうえお/

-pスイッチの使用は、存在しない複数のディレクトリを作成することです。私はちょうどそれが役立つかもしれないと思った。

tmp1すべてのサブディレクトリに一度に作成するにはどうすればよいですか?

これを行うことができるならば、どのように私はそれを作成するために拡張しない\tmp1\tmp2\tmp3\a\b\c一度に?

編集:私は、ディレクトリは、シンプルで順番に、同様である必要はありませんことを言及逃したabcなど、および作成するディレクトリは次のように、必ずしもではありませんtmp1tmp2

$ [〜/ practice] ls
犬/猫/ラット/

それらの中で、私は次のようなものを持ちたいです

$ [〜/ practice] ls *
犬:
赤青/

ネコ:
赤青/

ラット:
赤青/

1
クリストファーの答えを考えると、「\ a1、\ b2、および\ cに\ tmp1、\ tmp2、\ tmp3を作成する」の合計が3つまたは9つのサブディレクトリになるかどうかを明確にする必要があります。
マナトワーク

@manatwork:それは良い点です。9つのサブディレクトリを作成する必要があります。
Animesh

これは、ディレクトリの名前のスペースの問題を解決するための私の助けですsudo find ./ -depth -type d -exec echo '"{} / RCS"' \;

回答:


44

グロブ

for dir in */; do mkdir -- "$dir/tmp1"; done

注意

  • 私は、dirs(dirsへのシンボリックリンクを含む)のみを扱い*/、globとして使用するという小さなハックを行います。
  • 一度に複数のサブディレクトリを作成する場合:

    for dir in */; do mkdir -- "$dir"/{tmp1,foo,bar,qux}; done


for i in */; do mkdir "$i/itemone" "$i/itemtwo"; done順序が正しくない複数のディレクトリ名に対して実行できますか?
Animesh

私はこれをテストし、それは非常に可能です。ありがとう。
Animesh

編集した投稿を参照してください
ジルケノー

1
中括弧の展開は引用符付き文字列では実行されません。
マナトワーク

はい、おかげで、ポスト...に応じステファンChazelasで編集
ジルQuenot

10

[...] \ a1、\ b2、および\ cに\ tmp1、\ tmp2、\ tmp3を一度に作成するように拡張するにはどうすればよいですか?

 mkdir {a,b,c}/tmp{1,2,3}

10

GNUまたはBSD *の場合:

find -mindepth 1 -maxdepth 1 -type d -exec mkdir {}/newdir \;

またはパラメータ展開を使用:

dirs=(*/)
mkdir -- "${dirs[@]/%/newdir}"

* OS Xを含む


2
標準の検索構文を持つ:find . -name . -o -prune -type d -exec sh -c 'exec mkdir "$1/newdir"' sh {} \;
ステファンChazelas

1
また、2つのソリューションの違いに注意してください。最初のソリューションには隠しディレクトリが含まれ、2番目のソリューションには現在のディレクトリのシンボリックリンクによってリンクされたディレクトリにnewdirが追加されます。
ステファンシャゼル

6

あなたが言及しているので話題から外れていますがbash、記録のために、zshで、あなたはするでしょう:

dirs=(*(/))
mkdir -- $^dirs/tmp1

$^var配列の展開のためにブレースのような展開をオンにします。それはrc^演算子を連想させるもので、あなたはそれを書くでしょうrc(またはその派生物es):

dirs=(*/)
mkdir -- $dirs^tmp1

ただし、rcソリューションにdirsはディレクトリへのシンボリックリンクも含まれることに注意してください(ここに示したbashソリューションにも同じことが当てはまります)。zshソリューションで、ディレクトリへのシンボリックリンクを含めるかどうかを変更*(/)*(-/)ます。


シンボリックリンクに関するあなたのポイントのために+1!この動作は望ましい場合がありますが、重複ディレクトリの作成に関するmkdirの不満は、-pフラグを使用して抑制できます。
小次郎

4

移植性のある方法で、親ディレクトリをループします。

for d in */; do mkdir "$d/red" "$d/blue"; done

名前がで始まるディレクトリがある場合は--、後に追加mkdir-ます。

zshでは、e glob修飾子を使用して1つのコマンドで実行できます。

mkdir *(/e\''REPLY=($REPLY/{red,blue})'\')

ただし、これを2つのコマンドとして入力する方が簡単です。

d=(*(/)); mkdir $^d/{red,blue}

1
「参照であることを意味しているサイトでは、私はむしろ言うだろうmkdir -- whatever、とオミット --あなたがの拡大を意図した場合にどのような可能性へのオプションとして取られるべきmkdirコマンド。」。--ここで省略しても意味がありません。OPの場合は問題ではないかもしれませんが、一般的な場合は問題です。ここで正しい安全な構文を教える義務があると思います。
ステファンシャゼル

@StephaneChazelasスクリプトのコンテキストでは--、改行がサポートされていない場合、必要なすべての引用符と大きな太った警告を常に表示します。コマンドラインのコンテキストでは、実際に動作するクイックバージョンを最初に表示し、補完として防弾バージョンを表示することを好みます。
ジル「SO-悪であるのをやめる」


1

ディレクトリ以外のファイルを回避するsputnickの答えのバリエーション:

for x in *; do if [ -d "$x" ]; then mkdir "$x/tmp1"; fi; done

私はdirsに、「すべての魔法だということ...のみ扱う
ジルQuenot

かっこいい、
わかった

2
そうじゃないif [ -d "$x" ];…
小次郎

はい。ファイル名にスペースが含まれることはほとんどなく、そのようなものを忘れがちです
...-goldilocks

1

これは、古いUnixマスター(FreeBSD 10.1でテスト済み)からの良いものです(RCSチェックインロック付き:ci -l、初期コメント用にir:の短いコメント付き)/ etc / *構成ファイル〜/ .his / etcに

sudo rsync -av /etc/ ~/.his
sudo find -d ~/.his/etc -type d -exec echo '{}/RCS' \; | xargs sudo mkdir -p
sudo find -d ~/.his/etc \! -name "RCS" | xargs sudo ci -l -mir -t-ir

私は見ることができないか、この答えOP
Archemar

1

\でなければなりません 「RCS」という名前で、最初のチェックインで最適に機能します。

sudo find〜/ .his / etc \!-name "RCS" -ls

sudo find -d〜/ .his / etc \!-name "RCS" | xargs sudo ci -l -mir -t-ir

最後の1つは、ファイル名のすべてのRCSコンテンツをフィルタリングするcjeckでも非常にうまく機能します。

sudo find -d〜/ .his / etc -type f | grep -v RCS | xargs sudo ci -l -mir -t-ir


1

これは私にとって大きな助けです。私は複数のフォルダなどにサブディレクトリのセットを作成する必要がありました:

!/bin/sh

cd /dest/cont

for dir in */*/; do
    mkdir -p -- $dir/{FB,Video,Audio,proj};
done

空白が見つかった場合を除いて、うまく機能しました。*/*/引数の一部のスペースを無視する方法はありますか?

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