簡體   English   中英

循環命令,通過管道傳遞前一個命令的輸出

[英]Loop command, piping previous command's output

我知道您可以在bash中使用循環將命令重復一定次數,盡管在bash腳本中更方便地使用它。

例如,假設我有一個已被壓縮多次的文件,並且希望將其完全解壓縮。

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

這對於已壓縮3次的文件已經足夠實際,但是如果將文件壓縮18次,它將變得笨拙。 如何簡化呢? 我想對前一個命令的輸出運行gzip -d命令n次。 有沒有辦法從命令行執行此操作?

您可以通過以下方式來做到這一點(避免任何語法錯誤,請考慮類似於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"

如果您不記得或不知道文件被壓縮的頻率怎么辦? 您需要gunzipgunzip直到它成為普通文件。
當您不想覆蓋原始文件時,進行復制是最簡單的事情:

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循環將停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM