
私と同じシェルモードでは、{abc,def}xyz
それを使用してまだ存在していないファイル(またはディレクトリ)を作成できます。
$ ls
$ touch {abc,def}xyz
$ mkdir 123{a,b,c}
$ ls
123a 123b 123c abcxyz defxyz
私を混乱させることは、パターンに一致する各フォルダセット内にサブディレクトリを作成する方法です。たとえば、今123a
、123b
、 があるので、123c
明示的にリストせずに各ディレクトリ内にサブディレクトリを作成できますか?
$ mkdir {12*}/rsnapshot # Fails because 12* isn't a list
$ mkdir 12*/rnapshot # Fails because 12*/rsnapshot doesn't exist
$ mkdir 123{a,b,c}/rsnapshot # Succeeds but more complex than I'd like
最後の例は機能しますが、サブセクションに各ディレクトリ名の特定の部分をリストする必要があります{...}
。ディレクトリ数が多いと不可能です。
空白のない単純な名前にもこの行を適用しましたが、一般的なソリューションでは明確でもエレガントでもありません。
echo -n 12* '' | xargs -r -d ' ' -I {} echo mkdir {}/rsnapshot
bash
繰り返しなしで同様の名前のサブディレクトリセットにファイルまたはサブディレクトリを作成できるパターンテンプレートはありますか?
答え1
前のコマンドパラメータをもう一度呼び出すだけです。!$
mkdir 123{a,b,c}
mkdir !$/rsnapshot
パターンで指定されたディレクトリ名内にサブディレクトリを作成するために find を使用しない場合サイクル。
find . -maxdepth 1 -type d -name "123*" -exec mkdir '{}/rsnapshot' \;
答え2
dirs=( 123* )
set -- "${dirs[@]/%//deep/and deeper}"
mkdir -p "$@"
これは説明が必要ないようです…
答え3
「123{a,b,c}/rsnapshot より簡単な」ソリューションはありえないと思います。しかし、物事の複雑さに対する私たちの認識は大きく異なる可能性があります。
しかし、私は「シェルのような」ものを提供できます。残念ながら、パス名拡張で生成された要素を区切る文字を構成することは不可能に見えるbash
ため、より複雑になります。
:> dirs=(12*/.) # the dot makes it match directories only
:> echo ${dirs[*]}
123a/. 123b/. 123c/.
:> IFS=,
:> eval echo mkdir -p "{${dirs[*]}}/rsnapshot"
mkdir -p 123a/./rsnapshot 123b/./rsnapshot 123c/./rsnapshot
もちろん、これはパス名拡張一致にコンマが含まれていない場合にのみ機能します。これはで防ぐことができます$GLOBIGNORE
。
printf
そしてxargs
修正します。
printf "%s/rsnapshot\0" 12*/. | xargs -0 echo mkdir -p
答え4
(他の許可された答えから)すべての123
ディレクトリが有効なようです。
dirs=(123*/)
mkdir "${dirs[@]/%/rsnapshot}"