2017-01-29 6 views
0

bashでループを使用すると、コマンドを特定の回数繰り返すことができますが、bashスクリプトでは便利です。ループコマンドで前のコマンドの出力をパイプする

たとえば、何回か圧縮されたファイルがあり、完全に解凍したいとします。

cat file.txt | gzip -d | gzip -d | gzip -d 

これが3回圧縮されたファイルのための十分実用的であるが、ファイルが圧縮された場合には、例えば、18回を手に負えなくなってしまいます。どのようにこれを簡素化することができる?前のコマンドの出力に対してgzip -dコマンドをn回実行したい。コマンドラインからこれを実行する方法はありますか?

+0

関数を作成しますか? – 123

+0

これには理由もありますか? gzipを繰り返し実行したくないと思っていますが、これは単なる例ですか? – 123

+0

前のコマンドの出力を次のコマンドの入力として使用してn回コマンドを実行する方法の例として、これを使用していました。私はそれがコマンドラインから実行できるかどうか疑問に思っていました。 –

答えて

2

あなたは、これらの線に沿って何か(近いbashの構文に、この擬似コードを検討し、任意の構文エラーはご容赦)でそれを行うことができます:

#!/bin/bash 
# $1 = iterations left 
# $2 = final output file 
recursive_gzip() 
{ 
    if 
    [[ "$1" -gt 0 ]] 
    then 
    gzip -d | recursive_gzip $(($1 - 1)) "$2" 
    else 
    gzip -d > "$2" 
    fi 
} 

recursive_gzip 18 "file.txt" <"file.txt.gz" 

私は、リダイレクトを使用してcatを交換しますのでご注意ください。

あなたは、圧縮/解凍のために同じ機能を共有するためにアイデアを一般化し、実際には2

#!/bin/bash 
# $1 = iterations left 
# $2 = final output file 
recursive_pipe() 
{ 
    if 
    [[ "$1" -gt 0 ]] 
    then 
    "${@:3}" | recursive_pipe $(($1 - 1)) "$2" "${@:3}" 
    else 
    "${@:3}" > "$2" 
    fi 
} 

# Create gzipped file 
recursive_pipe 18 "file.txt.gz" gzip <"file.txt" 

# Uncompress gzipped file 
recursive_pipe 18 "file.txt" gzip -d <"file.txt.gz" 
+0

2番目の例では、 'then'ステートメントは' recursive_pipe'を参照する必要があります(編集を許可するのに十分な文字ではありません) – interloper

+0

@interloperこれをキャッチしてくれてありがとう。 – Fred

0

何ができない場合は後位置引数としてそれを使用することにより、任意のコマンドのために動作させることができファイルがどのくらいの頻度で圧縮されたかを覚えていないか、言わなかったか 通常のファイルになるまでgunzipにします。
コピーを作り、元のファイルを上書きしたくない最も簡単な方法です:

tmpfile=/tmp/mightbegz 
cp file.txt ${tmpfile}; 
while [ $? -eq 0 ]; do 
    echo "Gunzipping Again" 
    mv ${tmpfile} ${tmpfile}.gz 
    gunzip -d ${tmpfile}.gz 
done 

ときgzipができないgunzipファイルwhileループが停止します。

関連する問題