前提
你不应该在错误招致仅 15K与特定的名称格式文件[ 1,2 ]。
如果您从另一个目录运行该扩展,并且必须将路径添加到每个文件,则命令的大小将更大,并且当然会发生。
解决方案从该目录运行命令。
(cd That/Directory ; cat file_{1..2000}.pdb >> file_all.pdb )
最佳解决方案如果反而我猜不好,则从文件所在的目录中运行它……
恕我直言,最佳解决方案是StéphaneChazelas的解决方案:
seq -f 'file_%.17g.pdb' 15000 | xargs cat > file_all.pdb
用printf或seq; 在15k个文件上进行了测试,其编号仅在预高速缓存中,这甚至是速度更快的文件(目前,并且OP不在同一文件所在的目录中)。
还有一些话
您应该能够更长久地传递给Shell命令行。
您的命令行长度为213914个字符,包含15003个字
cat file_{1..15000}.pdb " > file_all.pdb" | wc
...甚至每个字加上8个字节也要比3333.1 ARG_MAX
内核上报告的2097142(2.1M)少333 938字节(0.3M),或者比报告为“我们实际上可以使用”通过xargs --show-limits
看看您的系统上的输出
getconf ARG_MAX
xargs --show-limits
懒惰引导解决方案
在这种情况下,即使通常会提供一种省时的解决方案,我还是更喜欢使用块。
逻辑(如果有的话)是我懒得写1 ... 1000 1001..2000等...
所以我要脚本来帮我。
仅在检查输出正确之后,才将其重定向到脚本。
...但是懒惰是一种精神状态。
由于我过敏xargs
(我确实应该在xargs
这里使用过)并且不想检查如何使用它,因此我准时完成了重新发明轮子的操作,如以下示例(tl; dr)所示。
请注意,由于文件名是受控的(没有空格,换行符...),因此您可以轻松使用下面的脚本。
tl; dr
版本1:将第一个文件号,最后一个,块大小,输出文件作为可选参数传递
#!/bin/bash
StartN=${1:-1} # First file number
EndN=${2:-15000} # Last file number
BlockN=${3:-100} # files in a Block
OutFile=${4:-"all.pdb"} # Output file name
CurrentStart=$StartN
for i in $(seq $StartN $BlockN $EndN)
do
CurrentEnd=$i ;
cat $(seq -f file_%.17g.pdb $CurrentStart $CurrentEnd) >> $OutFile;
CurrentStart=$(( CurrentEnd + 1 ))
done
# Here you may need to do a last iteration for the part cut from seq
[[ $EndN -ge $CurrentStart ]] &&
cat $(seq -f file_%.17g.pdb $CurrentStart $EndN) >> $OutFile;
版本2
调用bash进行扩展(在我的测试中要慢20%左右)。
#!/bin/bash
StartN=${1:-1} # First file number
EndN=${2:-15000} # Last file number
BlockN=${3:-100} # files in a Block
OutFile=${4:-"all.pdb"} # Output file name
CurrentStart=$StartN
for i in $(seq $StartN $BlockN $EndN)
do
CurrentEnd=$i ;
echo cat file_{$CurrentStart..$CurrentEnd}.pdb | /bin/bash >> $OutFile;
CurrentStart=$(( CurrentEnd + 1 ))
done
# Here you may need to do a last iteration for the part cut from seq
[[ $EndN -ge $CurrentStart ]] &&
echo cat file_{$CurrentStart..$EndN}.pdb | /bin/bash >> $OutFile;
当然,您可以前进并完全摆脱seq
[ 3 ](从coreutils中)并直接使用bash中的变量,或者使用python或编译ac程序来做到这一点[ 4 ] ...