以下の 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 変数を使用) に抽出します。
私の場合は、これを別のディレクトリから実行されるスクリプトに入れました。