次のコードが実行されています。
mkdir /home/karan/{Pictures,Public}/yo
上記の行は、yo
andというディレクトリ内に名前付きディレクトリを作成します。ただし、以下のコードを使用するとエラーが発生します。Public
Pictures
mkdir /home/karan/{P*}/yo
error: cannot create directory ‘/home/karan/{P*}/123’
アスタリスクが指定されたディレクトリに展開されないことを理解していますが、その理由は理解できません。また、アスタリスクの拡張を抑制するために引用メカニズムを使用しません。
答え1
を使用すると、zsh
次のことができます。
(){ mkdir $^@/yo; } /home/karan/P*(/)
(ここで$^array
open rcexpandparam
(スタイル配列拡張の場合)は拡張とそのglobの拡張rc
にのみ使用されます(ここで、glob修飾子はファイルタイプを制限するために使用されます)$array
/
目次$@
)匿名関数を使用して配列に変換します)。
またはこれを行うこともできます:
mkdir /home/karan/P*(/e:REPLY+=/yo:)
(e
評価glob修飾子を使用して/yo
一致するファイルにaを追加します。)
または:
set -o histsubstpattern
mkdir /home/karan/P*(/:s:%:/yo)
(この場合、:s/string/replacement/
cshスタイルの修飾子を使用して追加されます/yo
。Forはhistsubstpattern
パターンstring
として解釈され、kshと同様に、先行はパターンがテーマの${var/pattern/replacement}
最後%
に固定されることを意味します)
そしてrc
またはデリバティブ:
dirs = ( /home/karan/P*/ )
mkdir $dirs^yo
es
、派生関数の1つは上記と似ていますが、構文が異なる匿名関数もrc
あります。zsh
@ {mkdir $*^yo} /home/karan/P*/
そしてfish
:
set dirs /home/karan/P*/
mkdir ${dirs}yo
ksh93またはbash(またはzsh)を使用すると、いつでも次のことができます。
dirs=(/home/karan/P*/)
mkdir "${dirs[@]/%/yo}"
またはシェルとGNUを使用してくださいxargs
。
printf '%syo\0' /home/karan/P*/ | xargs -r0 mkdir
('s とは対照的に) の拡張には、P*/
ディレクトリへのシンボリックリンクも含まれます。実際に必要なものであれば、glob修飾子を置き換えます。zsh
P*(/)
zsh
/
-/
答え2
中括弧を拡張するパターンは、オプションの序文の形を取り、その後にカンマで区切られた文字列シーケンスまたは中括弧ペアの間のシーケンス式が続きます。
あなたの試み
-
mkdir /home/karan/{P*}/123
中括弧内にカンマやシーケンスがないため、有効な中括弧拡張形式ではありません。したがって、あなたはあなたが与えたものを正確に得ます/home/karan/{P*}/123
。
-
mkdir /home/karan/{P*,}/123
/home/karan/P*/123
ディレクトリの作成を試みる中括弧拡張(カンマに注意)/home/karan//123
。まだディレクトリがP*
ないため、ファイル名拡張子を使用した拡張子はまだありません。つまり、一致するものがない場合、ファイル名拡張は行われません。.../Pictures/123
.../Public/123
いずれにしても、(1)に示すように、単一要素に中括弧拡張を使用することは意味がありません.これは一つのシーソーのようなものです。直接
-
mkdir /home/karan/P*/123
同じ理由で失敗します。一致しません。
特定のケースではパスの綴りを避ける良い方法はありませんが、一致するディレクトリやパスが多い場合は、forループを使用してキーストロークを節約できます。
for d in /home/karan/P*/; do mkdir "$d"yo; done