web-dev-qa-db-ja.com

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

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

 $ [〜/練習] ls 
 a/b/c/d /

ここで、practiceのすべてのサブディレクトリにディレクトリ_tmp1_を作成し、これを実行します。

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

次に、_-p_スイッチを試してみると、_*_という名前のディレクトリと、サブディレクトリ_tmp1_があります。

 $ [〜/ practice] mkdir -p */tmp1 
 
 $ [〜/ practice] ls 
 */a/b/c/d/

_-p_スイッチの使用が複数の存在しないディレクトリを作成することであることは知っています。私はそれが役立つかもしれないと思いました。

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

これが可能である場合、どのように拡張して_\tmp1_、_\tmp2_、_\tmp3_を_\a_、_\b_および_\c_に一度に作成しますか? ?

編集:abcなどのように、ディレクトリが単純で順番に並んでいる必要はないことを説明しませんでした。作成されるディレクトリは必ずしも_tmp1_、_tmp2_のようなものではありません。

 $ [〜/練習] ls 
犬/猫/ラット/

それらの中で、私は次のようなものが欲しいです

 $ [〜/練習] ls * 
犬:
赤/青/

猫:
赤/青/ 
 
ラット:
赤/青/
35
Animesh

globs の場合:

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

注意

  • 私は、dirs(dirsへのシンボリックリンクを含む)のみを*/グロブとして
  • 一度に複数のサブディレクトリを作成したい場合:

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

44
Gilles Quenot

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

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

GNUまたはBSD *の場合:

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

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

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

* OS Xを含む

10
kojiro

bashについて言及しているため、話題外ですが、念のため、zshでは次のようにします。

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

_$^var_は、配列の拡張のためにブレースのような拡張をオンにします。これは、rcの_^_演算子を連想させ、rc(またはその派生物es)では、次のように記述します。

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

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

6

移植可能に、親ディレクトリをループします。

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

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

Zshでは、eglob qualifier を使用して1つのコマンドで実行できます。

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

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

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

これは、古い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
1
user108341

\! 「RCS」という名前で、最初のチェックイン時に最適に機能します。

Sudoは〜/ .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
user108341

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

!/bin/sh

cd /dest/cont

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

空白に遭遇した場合を除いて、うまくいきました。引数の*/*/部分のスペースを無視する方法はありますか?

1
johno

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

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

あなたはそれをそのようにすることができます:

mkdir {a,b,c,d}/tmp1