繁体   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