ディレクトリ内の各ファイルのディレクトリを作成しようとしています。
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})
または:s
globに適用された履歴修飾子(histsubstpattern
for%
終わり):
set -o histsubstpattern
mkdir -- *(:s/%/.d)
^-/
glob修飾子を追加して、すでにディレクトリまたはディレクトリシンボリックリンクであるファイルに対してこれを実行したくない場合があります。
files=(*(^-/))
mkdir -- $^files.d
(zsh
一致しないパターンがそのまま渡される他のBourne様シェルの欠陥がないため、現在のディレクトリに一致するファイルがない場合、mkdir *.d
ディレクトリは生成されず、代わりにコマンドを中断します。エラー)*.d
*.d