[英]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"
如果您不记得或不知道文件被压缩的频率怎么办? 您需要gunzip
其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循环将停止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.