Bashワイルドカードは拡張されません。

Bashワイルドカードは拡張されません。

ディレクトリ内の各ファイルのディレクトリを作成しようとしています。

mkdir *

ファイルが存在することを返します。だから私は努力します

mkdir *.d

「*.d」というディレクトリを作成します。ワイルドカード拡張を強制する方法は?

答え1

ワイルドカードは常に次に拡張されます。既存の名前。

mkdir *拡張名がすでに存在しているため、コマンドは失敗しました*

既存の名前と一致しないため、コマンドはmkdir *.d「失敗」します。*.dしたがって、デフォルトでは、モードは1を*.d拡張しないというディレクトリを作成します。を使って削除できますrmdir '*.d'

各ディレクトリのディレクトリの作成一般ファイル新しいディレクトリがファイルと同じ名前を持つが、サフィックスが付くように現在のディレクトリに.d:

for name in ./*; do
    if [ -f "$name" ]; then
        # this is a regular file (or a symlink to one), create directory
        mkdir "$name.d"
    fi
done

または「quips」が好きな方のために

for n in ./*; do [ -f "$n" ] && mkdir "$n.d"; done

以下でもbashこれを行うことができます。

names=( ./* )
mkdir "${names[@]/%/.d}"

しかし、これはglobが拡張するコンテンツが通常のファイルであるか他のファイルであるかを確認しません。

上記のコマンドの最初の文字は、ファイル名に最初の文字ダッシュ()が含まれないように./するためのものです。-それ以外の場合は、ダッシュとその後の文字がオプションとして解釈されますmkdir


一部のシェルには、 一致しないシェルワイルドカードを空の文字列に拡張するシェルオプションがあります。nullglobここでbash使用を有効にしてくださいshopt -s nullglob

答え2

for foo in bar; do baz; done私が提案するのは解決策ではありません。

find . -maxdepth 1 -type f -print0|xargs -0 -I file mkdir file.d

答え3

*.d名前をに展開します.d

これにより、zsh次のことができます。

files=(*)
mkdir -- $^files.d

または匿名関数を使用してください。

() { mkdir -- $^argv.d; } *

または、glob修飾子を使用してサフィックスを追加してくださいe

mkdir -- *(e{REPLY+=.d})

または:sglobに適用された履歴修飾子(histsubstpatternfor%終わり):

set -o histsubstpattern
mkdir -- *(:s/%/.d)

^-/glob修飾子を追加して、すでにディレクトリまたはディレクトリシンボリックリンクであるファイルに対してこれを実行したくない場合があります。

files=(*(^-/))
mkdir -- $^files.d

zsh一致しないパターンがそのまま渡される他のBourne様シェルの欠陥がないため、現在のディレクトリに一致するファイルがない場合、mkdir *.dディレクトリは生成されず、代わりにコマンドを中断します。エラー)*.d*.d

関連情報