循环命令,管道上一个命令的输出

时间:2017-01-29 21:15:15

标签: linux bash shell

据我所知,你可以在bash中使用循环来重复命令一定次数,尽管它在bash脚本中更方便使用。

例如,假设我有一个已经压缩过几次的文件,我希望完全解压缩它。

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

这对于已压缩3次的文件来说已经足够实用了,但如果文件被压缩(例如18次),它将变得难以处理。怎么可以简化?我想在上一个命令的输出上运行gzip -d命令n次。有没有办法从命令行执行此操作?

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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循环将停止。