zip 名のパターンに基づいて zip ファイルをディレクトリに抽出します。

zip 名のパターンに基づいて zip ファイルをディレクトリに抽出します。

以下の zip ファイルがあります:

PLP_633555_2015-03-04_01-12-01.zip
PLP_634562_2004-03-02_02-15-07_UBIC.zip
PLP_563462_2008-05-02_01-21-03_UBIC_STOC.zip

そして、各 zip を次の形式で適切なディレクトリに抽出する必要があります (基本的に、最初の 30 文字のみが必要です)。

PLP_633555_2015-03-04_01-12-01
PLP_634562_2004-03-02_02-15-07
PLP_563462_2008-05-02_01-21-03

これは私が現在使用しているコマンドですが、2 番目の zip ファイル (PLP_634562_2004-03-02_02-15-07_UBIC.zip) に対してのみ機能します。

for f in /PLP*.zip; do n=$(echo $f | cut -f 1-5 -d '_'); unzip -d $n $f;done

zip ファイルの最初の 30 文字のみを読み取り、それに基づいてディレクトリを作成するように変更したいと思います。これにより、将来的に新しい zip ファイルの命名形式が確実に機能するようになります。

コマンドのn変数部分を次のように変更してみました

n=$(echo ${f:0:30}); 

しかし、それは機能しませんでした。私は Linux bash を使用しています。

答え1

sed最初の 30 文字を取得できます:

sed 's|\(.\{30\}\).*|\1|'

cutループ内で代わりにそれを使用しますfor

その置換の内訳は、で置換したsed間に一致するもの (でエスケープ) は 30 個の単一文字 ( ) をカウントします。\( \)\1{30}\.

答え2

ご提案いただきありがとうございます。皆様のご提案から一部を抜粋してこのコマンドを作成しました。私の場合、まさにこれが必要なコマンドです。

for f in /mydirectory/*.zip; do
   n=$(echo ${f##*/} | cut -c1-30);
   unzip -d /mydirectory/$n $f;
done
  • すべてのzipファイルをループします
  • 各 zip ファイルをエコーし​​ (ファイル名のみ、サイズやパスなどの追加情報は表示されません)、最初の 30 文字のみを表示して n 変数に保存します。
  • 次に、各 zip ファイルの内容を新しいディレクトリ (n 変数を使用) に抽出します。

私の場合は、これを別のディレクトリから実行されるスクリプトに入れました。

関連情報