Bash:指定文件的串联n次,以便生成的文件长度(以字节为单位)不超过预定数量

时间:2016-02-27 06:07:41

标签: bash unix concatenation

这就是我能做的一切。请帮忙。

COUNT=$(( $FILESIZE/$(stat -c %s $FILENAME) ))
for i in $(seq 1 $COUNT); do
    cat $FILENAME;
done >$RESULTFILE

如果您了解一些学习bash的有用资源,请给予链接。

2 个答案:

答案 0 :(得分:1)

你有很多问题。首先,您不是在每次迭代期间递增总大小,以便与您的限制进行比较,该限制将指示您何时完成。尝试:

#!/bin/bash

[ -f "$1" ] || {  ## validate filename given
    printf "error: file not found., usage:  %s filename.\n" "${0/*\/}"
    exit 1
}

fsize=$(stat -c %s "$1")  ## single file size
total=0                   ## running total size
flimit=$((3 * fsize))     ## set to desired multiple (can take as argument)
resfile=/tmp/resfile      ## set to wanted filename
:> "$resfile"             ## truncate file to 0

while ((total < flimit)); do  ## loop while total < flimit
    cat "$1" >> "$resfile"
    total=$((total + fsize))
done

仔细看看,如果您有疑问,请告诉我。

更简单的替代

除非您有一些令人信服的理由使用文件大小,否则只需连接所需的副本数即可简化脚本。 e.g:

copies=3               ## number of copies to resfile
resfile=/tmp/resfile   ## set to wanted filename
:> "$resfile"          ## truncate file to 0

for ((i = 0; i < copies; i++)); do
    cat "$1" >> "$resfile"
done

答案 1 :(得分:-1)

主要问题是您的cat只是在每次迭代时输出到终端。这样做是为了迭代地将输出附加到输出文件:

COUNT=$(( $FILESIZE/$(stat -c %s $FILENAME) ))
echo -n >$RESULTFILE
for i in $(seq 1 $COUNT); do
    cat $FILENAME >>$RESULTFILE
done