
このコードは、複数の.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
- リストモデルの代わりにパイプを使用する
- 単一引数を取るローカル関数の定義
- プロセッサ数だけ並列プロセスを実行する