次のようなディレクトリ構造があるとします。
$ [〜/練習] 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
_に一度に作成しますか? ?
編集:a
、b
、c
などのように、ディレクトリが単純で順番に並んでいる必要はないことを説明しませんでした。作成されるディレクトリは必ずしも_tmp1
_、_tmp2
_のようなものではありません。
$ [〜/練習] ls 犬/猫/ラット/
それらの中で、私は次のようなものが欲しいです
$ [〜/練習] ls * 犬: 赤/青/ 猫: 赤/青/ ラット: 赤/青/
globs の場合:
for dir in */; do mkdir -- "$dir/tmp1"; done
*/
グロブとして一度に複数のサブディレクトリを作成したい場合:
for dir in */; do mkdir -- "$dir"/{tmp1,foo,bar,qux}; done
[...]\a、\ b、\ cに一度に\ tmp1、\ tmp2、\ tmp3を作成するように拡張するにはどうすればよいですか?
mkdir {a,b,c}/tmp{1,2,3}
GNUまたはBSD *の場合:
find -mindepth 1 -maxdepth 1 -type d -exec mkdir {}/newdir \;
またはパラメータ展開を使用:
dirs=(*/)
mkdir -- "${dirs[@]/%/newdir}"
* OS Xを含む
bash
について言及しているため、話題外ですが、念のため、zshでは次のようにします。
_dirs=(*(/))
mkdir -- $^dirs/tmp1
_
_$^var
_は、配列の拡張のためにブレースのような拡張をオンにします。これは、rc
の_^
_演算子を連想させ、rc
(またはその派生物es
)では、次のように記述します。
_dirs=(*/)
mkdir -- $dirs^tmp1
_
ただし、rcソリューションではdirs
にもディレクトリへのシンボリックリンクが含まれることに注意してください(これは、ここで示すbashソリューションにも当てはまります)。 zshソリューションで、ディレクトリへのシンボリックリンクを含める場合は、*(/)
を*(-/)
に変更します。
移植可能に、親ディレクトリをループします。
for d in */; do mkdir "$d/red" "$d/blue"; done
名前が--
で始まるディレクトリがある場合は、mkdir
の後に-
を追加します。
Zshでは、e
glob 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
\! 「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
これは私にとって大きな助けです。私は複数のフォルダにサブディレクトリのセットを作成する必要がありました:
!/bin/sh
cd /dest/cont
for dir in */*/; do
mkdir -p -- $dir/{FB,Video,Audio,proj};
done
空白に遭遇した場合を除いて、うまくいきました。引数の*/*/
部分のスペースを無視する方法はありますか?
非ディレクトリファイルを回避するsputnickの回答のバリエーション:
for x in *; do if [ -d "$x" ]; then mkdir "$x/tmp1"; fi; done
あなたはそれをそのようにすることができます:
mkdir {a,b,c,d}/tmp1