web-dev-qa-db-ja.com

xargsでグロブを拡張する

私はこのようなディレクトリを持っています

mkdir test
cd test
touch file{0,1}.txt otherfile{0,1}.txt stuff{0,1}.txt

ディレクトリ内の特定の種類のファイルに対してlsなどのコマンドを実行し、*(glob)をファイル名のすべての可能性に展開させたい。

echo 'file otherfile' | tr ' ' '\n' | xargs -I % ls %*.txt

このコマンドはglobを展開せず、リテラル 'file * .txt'を検索しようとします

グローブを展開する同様のコマンドを作成するにはどうすればよいですか? (コマンドを並行して実行できるようにxargsを使用したい)

7
Craig

これは古いですが、私はこの問題に遭遇し、それを修正する別の方法を見つけました。 xargsに-cとコマンドを使用してbashを実行させます。例えば:

echo 'file otherfile' | tr ' ' '\n' | xargs -I % bash -c "ls %*.txt"

これにより、グロブが強制的に拡張されます。

12
axlerod

ls-1フラグを使用することで、必要な機能を取得できました。これが私のコマンドの外観です:

ls -1 {file,otherfile}*.txt | xargs -I% echo mycommand %
3
Dave Parrish

Globは実行時にxargsコマンドによって展開されないため、実行していることは機能しません。Enterキーを押すとすぐに、これらのコマンドのいずれかが実行を開始する前に、シェルによって展開されます。したがって、拡張しようとするグロブは次のとおりです。

%*.txt

そのパターンに一致するファイルがないため、そのままにしておき、xargsを実行すると、その引数をその文字列に置き換えます。

最も簡単な解決策は、おそらく、関心のあるすべてのファイルに一度に一致するパターンを作成することです。

ls {file,otherfile}*.txt
2
TomH