我有一个名为SOURCE的文件,我想创建一个名为TARGET的特定长度的文件,其中包含SOURCE的副本。 TARGET的长度不一定是SOURCE长度的整数倍。我想在Linux上使用bash来做这件事。
我的第一次尝试就是:
while true; do cat SOURCE; done | head -c $TARGET_LENGTH > TARGET
在将指定的字节数写入TARGET后挂起。如何让它不挂? (我怀疑我错过了关于管道和信号如何工作的细节。)
编辑:我知道while true
会永远运行,但我希望head命令在消耗指定的字节数后关闭所有内容。
答案 0 :(得分:6)
这个怎么样?
while cat SOURCE; do true; done | head -c "$TARGET_LENGTH" > TARGET
答案 1 :(得分:1)
这是一个漫长的解决方案......有人可以做一些更优雅的事吗?
echo > $TARGET
sourceLength=`wc -c $SOURCE | awk '{print $1}'`
let loops=$(( $TARGET_LENGTH/$sourceLength ))
let n=0;
while [ $n -lt $loops ]; do
let n=$(( $n+1 )) || exit 1
cat $SOURCE >> $TARGET
done
let mod=$(( $TARGET_LENGTH % $sourceLength ))
head -c $mod $SOURCE >> $TARGET
答案 2 :(得分:0)
你需要摆脱while循环。
例如,使用临时文件,填充它直到它的大小与目标长度相同或大于目标长度,然后跳出循环并使用head -c将临时文件输出到目标gile中。
while true; do
cat $SOURCE_FILE >> /tmp/temp.out;
TMP_LENGTH=$(wc -c /tmp/temp.out |awk '{print $1}')
if [ $TMP_LENGTH -ge $TARGET_LENGTH ]; then
break
fi
done
head -c $TARGET_LENGTH /tmp/temp.out > $TARGET_FILE