据我所知,你可以在bash中使用循环来重复命令一定次数,尽管它在bash脚本中更方便使用。
例如,假设我有一个已经压缩过几次的文件,我希望完全解压缩它。
cat file.txt | gzip -d | gzip -d | gzip -d
这对于已压缩3次的文件来说已经足够实用了,但如果文件被压缩(例如18次),它将变得难以处理。怎么可以简化?我想在上一个命令的输出上运行gzip -d命令n次。有没有办法从命令行执行此操作?
答案 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循环将停止。