中かっこ拡張内のパス名拡張

中かっこ拡張内のパス名拡張

次のコードが実行されています。

mkdir /home/karan/{Pictures,Public}/yo

上記の行は、yoandというディレクトリ内に名前付きディレクトリを作成します。ただし、以下のコードを使用するとエラーが発生します。PublicPictures

mkdir /home/karan/{P*}/yo
error: cannot create directory ‘/home/karan/{P*}/123’

アスタリスクが指定されたディレクトリに展開されないことを理解していますが、その理由は理解できません。また、アスタリスクの拡張を抑制するために引用メカニズムを使用しません。

ベストアンサー1

を使用すると、zsh次のことができます。

(){ mkdir $^@/yo; } /home/karan/P*(/)

(ここで$^arrayopen 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修飾子を置き換えます。zshP*(/)zsh/-/

おすすめ記事