115

Bash で一連のパッケージの名前を変更して、バージョン番号を削除するにはどうすればよいですか? 私は と の両方exprをいじっていましたが、役に立ち%%ませんでした。

例:

Xft2-2.1.13.pkgになるXft2.pkg

jasper-1.900.1.pkgになるjasper.pkg

xorg-libXrandr-1.2.3.pkgになるxorg-libXrandr.pkg

4

10 に答える 10

214

bashのパラメーター拡張機能を使用できます

for i in ./*.pkg ; do mv "$i" "${i/-[0-9.]*.pkg/.pkg}" ; done

スペースを含むファイル名には引用符が必要です。

于 2009-03-02T15:33:46.907 に答える
11

私はこのようなことをします:

for file in *.pkg ; do
    mv $file $(echo $file | rev | cut -f2- -d- | rev).pkg
done

すべてのファイルが現在のディレクトリにあると仮定します。そうでない場合は、上記の Javier のアドバイスに従って find を使用してみてください。

編集: また、このバージョンは、上記の他の機能と同様に、bash 固有の機能を使用しないため、移植性が向上します。

于 2009-03-02T15:35:54.687 に答える
1

これは、

  • すべてが $pkg で終わる
  • バージョン番号は常に「-」で始まります

.pkg を剥ぎ取り、次に剥ぎ取ります -..

for x in $(ls); do echo $x $(echo $x | sed 's/\.pkg//g' | sed 's/-.*//g').pkg; done
于 2009-03-02T15:33:35.907 に答える
0

この答えをありがとう。私も何かしらの問題を抱えていました。.nzb.queued ファイルを .nzb ファイルに移動します。ファイル名にスペースやその他の問題があり、これで問題が解決しました。

find . -type f -name "*.nzb.queued" |
sed -ne "s/^\(\(.*\).nzb.queued\)$/mv -v \"\1\" \"\2.nzb\"/p" |
sh

Diomidis Spinellis の回答に基づいています。

正規表現は、ファイル名全体に対して 1 つのグループを作成し、.nzb.queued の前の部分に対して 1 つのグループを作成してから、シェル移動コマンドを作成します。引用された文字列で。これは、sed によって既に行われているため、シェル スクリプトでのループの作成も回避します。

于 2014-10-30T08:53:22.487 に答える