
さまざまなバージョンのdebディレクトリのリストがあります。私の要件は、一致するバージョンのパッケージを見つけることです。
私が今まで試したことは次のとおりです。
ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3'
上記のコマンドは、Package1のo / pのみを提供します。
みんな試してみましたオプションここから。しかし、それらのどれも助けませんでした。
答え1
まず、解析しないことに関する一般的な警告ls
。つまり、ファイル名が適切に指定されたと仮定すると、次のようにできます。
ls debs/*1.1.16* | grep -E 'Package1|Package2|package3'
ここで唯一の違いは、最初のgrepを使用しなかったことです。これはglobパターンを直接渡すことができるので不要ですls
。その後、egrep
廃止されたものを使用しましたが、grep -E
同じです。
ただし、これは基本的にコマンドと同じです。それでも機能しない場合は、一致するファイルがありません。
$ ls debs/
1.1.16.Package3 Package1.1.1.160 Package1.1.2.16 Package2.1.1.16
$ ls debs/*1.1.16* | grep -E 'Package1|Package2|package3'
debs/Package1.1.1.160
debs/Package2.1.1.16
予想通り、2 つの一致するファイルが表示されます。これがコマンドが印刷する内容です。
$ ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3'
debs/Package1.1.1.160
debs/Package2.1.1.16
スキーマpackage3
は小文字(p
代わりにP
)なので、grep
ファイルは表示されません。1.1.16.Package3
答え2
ls
出力を切り捨てずにこれを行う方法があります。
version=1.1.16
for package in debs/*Package1*${version}* \
debs/*Package2*${version}* \
debs/*package3*${version}*;
do
action with $package;
done
その後、シェルはglobを展開し、一致するファイルを繰り返します。指定されたパターンに一致するファイルがない場合、スクリプトはエラーなしでループをスキップします。
または、次のことを試してくださいfind
。
version=1.1.16
find debs/ \( -name "*Package1*${version}*" -o -name "*Package2*${version}*" -o -name "*package3*${version}*" \)