以下を含む引数として渡されたディレクトリセットからファイルを選択しようとしています。
${@/%/*}
ただし、空白のあるパスが破損し、引用パラメータの拡張によりファイル名の拡張が停止されるため、理想的ではありません。満足のいく解決策がありますか?
PS:これを行う必要があることを知っていますが、find -maxdepth
パラメータ拡張とワイルドカードを混在させるのはなぜそれほど難しいのか疑問に思います。
ベストアンサー1
いつでも次のことができます。
IFS= # don't split
files=(${@/%/*}) # use split+glob upon expansion with split disabled
ただし、"$@"
ワイルドカード文字が含まれている場合は、ワイルドカード文字として解釈されます。さらに、一致しないすべてのグロブに対して拡張されていないパターンが生成されます。
nullglob
ループとオプションを使用すると、次の問題を解決できます。
shopt -s nullglob
files=()
for arg do files+=("$arg"*); done
zsh
代わりに、次のものを使用できますbash
。
files=($^argv*(N))
$^array
rcexpandparam
拡張オプションを開きます$array
。rc
シェル(およびシェルでもfish
)では、$array*
whereは$array
2つの要素a
を取得してb
拡張するので、a*
ここb*
ではdoと同じですfiles=($argv[1]*(N) $argv[2]*(N)...)
($argv[1]
doと同じ$1
、もう少し冗長です)。これはそれ自体でglobの動作を(N)
有効にするglob修飾子です。nullglob
fish
シェルでは次のようになります。
set files $argv*
asは引数で同様の動作をfish
有効にし、同様に配列を拡張します。しかし、more thanと構文が完全に異なることに注意してください。nullglob
set
rc
fish
bash
zsh
これは、必要に応じて"$1"*
グローバルに拡大するように設計されています。あなたが実際に...滴を意味するならば、"$2"*
${@/%/*}
"$1"/*
"%2"/*
引数として渡されたディレクトリのファイルセット提案は、上記のコードスニペットで、、${@/%/\/*}
を"$arg"/*
使用する必要があることです$^argv/*(N)
。$argv*