bash:从另一个文件填充文件

时间:2015-02-20 16:47:31

标签: linux bash

我有一个名为SOURCE的文件,我想创建一个名为TARGET的特定长度的文件,其中包含SOURCE的副本。 TARGET的长度不一定是SOURCE长度的整数倍。我想在Linux上使用bash来做这件事。

我的第一次尝试就是:

while true; do cat SOURCE; done | head -c $TARGET_LENGTH > TARGET

在将指定的字节数写入TARGET后挂起。如何让它不挂? (我怀疑我错过了关于管道和信号如何工作的细节。)

编辑:我知道while true会永远运行,但我希望head命令在消耗指定的字节数后关闭所有内容。

3 个答案:

答案 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