Bash:将指定的文件连接n次,以使生成的文件长度(以字节为单位)不超过预定的数字

Bash:将指定的文件连接n次,以使生成的文件长度(以字节为单位)不超过预定的数字,bash,unix,concatenation,Bash,Unix,Concatenation,这就是我所能做的。请帮忙 COUNT=$(( $FILESIZE/$(stat -c %s $FILENAME) )) for i in $(seq 1 $COUNT); do cat $FILENAME; done >$RESULTFILE 如果你知道一些学习bash的有用资源,请给我一个链接。你有很多问题。首先,在每次迭代期间,您不会增加总大小,以与完成时将指示的限制进行比较。尝试: #!/bin/bash [ -f "$1" ] || { ## validate fil

这就是我所能做的。请帮忙

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

如果你知道一些学习bash的有用资源,请给我一个链接。

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

#!/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
#/bin/bash
[-f“$1”]|{##验证给定的文件名
printf“错误:找不到文件,用法:%s文件名。\n”“${0/*\/}”
出口1
}
fsize=$(stat-c%s“$1”)##单个文件大小
总尺寸=0##运行总尺寸
flimit=$((3*fsize))35;#设置为所需的倍数(可以作为参数)
resfile=/tmp/resfile##设置为想要的文件名
:>“$resfile”##将文件截断为0
而((总>“$resfile”
总计=$((总计+fsize))
完成
仔细看一下,如果有问题请告诉我

更简单的备选方案

除非您有充分的理由使用文件的大小,否则您可以通过连接所需的副本数量来简化脚本。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
copies=3##要重新归档的副本数
resfile=/tmp/resfile##设置为想要的文件名
:>“$resfile”##将文件截断为0
(i=0;i>“$resfile”
完成

主要问题是您的
cat
在每次迭代时都只是输出到终端。改为执行此操作以迭代方式将输出附加到输出文件:

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

OP在完成后写入输出文件。这比在while循环中更好,outputfile只需打开一次。