1

次のような文字列に一致するフォルダー内のファイルを見つける必要があります。

私が持っているとしましょう:

/var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz
/var/cache/pacman/pkg/vim-7.3.918-2-x86_64.pkg.tar.xz
/var/cache/pacman/pkg/vim-7.44.918-2-x86_64.pkg.tar.xz

次のようなものを実行できるようにしたい

find /var/cache/pacman/pkg -name 'vim*'

そして、「vim」を含む行のみを返す必要があります。現時点では、-name 'vim*' のために明らかに vim-runtime を取得しています。

グロブパターンを使用する必要があります。

すべての形式は次のとおりです。

cachedir               package     packageVersion packageRelease architecture extesnion
/var/cache/pacman/pkg/ vim-runtime 7.3.754        1              x86_64       pkg.tar.xz
/var/cache/pacman/pkg/ vim         7.3.918        2              x86_64       pkg.tar.xz

したがって、基本的には「find」コマンドを使用して正確なパッケージを見つける必要があります

4

3 に答える 3

2

/var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xzに変わる

/var/cache/pacman/pkg/ vim-runtime 7.3.754        1              x86_64       pkg.tar.xz

あなたが使用することができます:

files=(
    /var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz 
    /var/cache/pacman/pkg/vim-7.3.918-2-x86_64.pkg.tar.xz
    /var/cache/pacman/pkg/vim-7.44.918-2-x86_64.pkg.tar.xz
)
for f in "${files[@]}"; do
    if [[ $f =~ ^(.*/)(.*)-([^-]+)-([0-9])-([^.]+)\.(.*) ]]; then 
        for i in "${!BASH_REMATCH[@]}"; do 
            echo "$i => ${BASH_REMATCH[$i]}"
        done
    fi      
done

これは出力します

0 => /var/cache/pacman/pkg/vim-runtime-7.3.754-1-x86_64.pkg.tar.xz
1 => /var/cache/pacman/pkg/
2 => vim-runtime
3 => 7.3.754
4 => 1
5 => x86_64
6 => pkg.tar.xz
0 => /var/cache/pacman/pkg/vim-7.3.918-2-x86_64.pkg.tar.xz
1 => /var/cache/pacman/pkg/
2 => vim
3 => 7.3.918
4 => 2
5 => x86_64
6 => pkg.tar.xz
0 => /var/cache/pacman/pkg/vim-7.44.918-2-x86_64.pkg.tar.xz
1 => /var/cache/pacman/pkg/
2 => vim
3 => 7.44.918
4 => 2
5 => x86_64
6 => pkg.tar.xz

あなたはおそらくしたいでしょうfor f in /var/cache/pacman/pkg/*; do

于 2013-06-21T10:18:06.150 に答える
1

私の理解が正しければ、vim-runtime .gz ではなく、vim-.gzを検索する必要があります。それが正しい場合は、質問をより明確にしてください。答えは次のようになります。

正規表現は間違ったトラックです。-name オプションが正規表現を使用していないことがわかります。コマンドラインで指定したようなファイルグロブパターンを使用します。試す

find /var/cache/pacman/pkg -name 'vim-[0-9]*.gz'

編集:vim-[0-9]*パッケージ名に数字が含まれるパッケージを検出するため、良くありません。しかし、これはどうですか?

find /var/cache/pacman/pkg -name 'vim-*-*-*.pkg.tar.xz'

編集:申し訳ありませんが、私のせいです。*が一致するため機能しませんruntime-7.3.754。たぶん、正規表現のアイデアは私が思っていたよりも優れていたのでしょう (-regex オプションを知りませんでした)。これはどう?

find /var/cache/pacman/pkg -regex '.*/vim-[^-]*-[^-]*-[^-]*.pkg.tar.xz'
于 2013-06-21T08:49:44.493 に答える