まだ存在しないファイルのファイル名パターン

まだ存在しないファイルのファイル名パターン

私と同じシェルモードでは、{abc,def}xyzそれを使用してまだ存在していないファイル(またはディレクトリ)を作成できます。

$ ls
$ touch {abc,def}xyz
$ mkdir 123{a,b,c}
$ ls
123a  123b  123c  abcxyz  defxyz

私を混乱させることは、パターンに一致する各フォルダセット内にサブディレクトリを作成する方法です。たとえば、今123a123b、 があるので、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}"

関連情報