Gunzip は、*.gz ファイルを別の場所に解凍します。

Gunzip は、*.gz ファイルを別の場所に解凍します。

このコードは、複数の.tarファイルを別の場所に抽出するために書かれており、正常に動作しました。

ls -1 ${short_filename} \
| while read file; do \
  tar -zxvf "$file" -C ${pentaho_temp_path}/${sessionkey}; \
done

Linuxシステムでは、.gzファイルで同じことをしたいと思います。私のファイル名にはスペースがなく、次のようになります。

xport_RAN_Maa_LIM_10.93.217.170_20220629030929.xml.gz
xport_RAN_Maa_LIM_10.93.217.170_20220630030936.xml.gz 
xport_RAN_Mau_MPU_10.188.83.138_20220629031403.xml.gz 
xport_RAN_Mau_MPU_10.188.83.138_20220630031444.xml.gz 

答え1

gzipファイルには「ファイル」は含まれておらず、バイトストリームのみが含まれています。したがって、解凍したい場合はgzip -d --stdout "${file}" > "${target_directory}/${target_file}"

あなたのスクリプトに注意してください。ただ専用*.tar.gz-z、すでに旗のためです。

答え2

スクリプトは不必要に複雑です。改行はすべてのコマンド|とコマンドの後に実行できるため、行は必要ありません。同じスクリプトを次のように書くことができます。do\

ls -1 "$short_filename" | 
    while read file; do
        tar -zxvf "$file" -C "$pentaho_temp_path/$sessionkey"
    done

しかし、これは悪い考えです。他の人が指摘したように、構文解析はls非常に脆弱であるため、避けるべきです。上記のスクリプトに必要なものはすべて次のようなので、この場合にも意味がありません。

for file in "$short_filename"/*; do
    tar -zxvf "$file" -C "$pentaho_temp_path/$sessionkey"
done

ただし、ファイルがすべて解凍されているため、.gzまったくそうする必要はなく、次のことができます。tar

for file in "$short_filename"/*; do
    zcat "$file" > "$pentaho_temp_path/$sessionkey"/"$(basename "$file" .gz)"
done

答え3

考えてみてください:

for file in "$short_filename"/*.gz; do
  zcat "$file" > "$pentaho_temp_path/$sessionkey/$(basename "$file" .gz)"
done
  • ls配管出力防止
  • .gz 拡張子のみフィルタリング
  • 拡張子なしでファイル名を区切るためにフルパスを解析します。basename "$fullpath" .gz

ファイル名に改行文字が含まれていないと確信している場合は、ファイル名をパイピングしてプロセスを並列化できます。

myzcat(){ zcat "$1" > "$pentaho_temp_path/$sessionkey/$(basename "$1" .gz)"; }

ls "$short_filename"/*.gz | parallel myzcat
  • リストモデルの代わりにパイプを使用する
  • 単一引数を取るローカル関数の定義
  • プロセッサ数だけ並列プロセスを実行する

関連情報