Premis
Anda seharusnya tidak melakukan kesalahan itu hanya untuk file 15k dengan format nama spesifik [ 1 , 2 ] .
Jika Anda menjalankan ekspansi itu dari direktori lain dan Anda harus menambahkan path ke setiap file, ukuran perintah Anda akan lebih besar, dan tentu saja itu bisa terjadi.
Solusi menjalankan perintah dari direktori itu.
(cd That/Directory ; cat file_{1..2000}.pdb >> file_all.pdb )
Solusi Terbaik Jika sebaliknya saya menduga buruk dan Anda menjalankannya dari direktori di mana file-file tersebut ...
IMHO solusi terbaik adalah yang Stéphane Chazelas ' :
seq -f 'file_%.17g.pdb' 15000 | xargs cat > file_all.pdb
dengan printf atau seq; diuji pada file 15k dengan hanya nomor mereka di dalam pra-cache itu bahkan yang lebih cepat (saat ini dan kecuali OP satu dari direktori yang sama di mana file tersebut).
Beberapa kata lagi
Anda harus bisa melewati baris perintah shell Anda lebih lama.
Baris perintah Anda adalah 213914 karakter dan berisi 15003 kata
cat file_{1..15000}.pdb " > file_all.pdb" | wc
... bahkan menambahkan 8 byte untuk setiap kata adalah 333 938 byte (0,3M) jauh di bawah 2097142 (2,1M) yang dilaporkan oleh ARG_MAX
kernel 3.13.0 atau 2088232 yang sedikit lebih kecil dilaporkan sebagai "Panjang perintah maksimum yang sebenarnya bisa kita dapat gunakan " olehxargs --show-limits
Coba lihat pada sistem Anda untuk output dari
getconf ARG_MAX
xargs --show-limits
Solusi yang dipandu kemalasan
Dalam kasus seperti ini saya lebih suka bekerja dengan balok bahkan karena biasanya keluar solusi waktu yang efisien.
Logikanya (jika ada) adalah saya terlalu malas untuk menulis 1 ... 1000 1001..2000 dll ...
Jadi saya meminta script untuk melakukannya untuk saya.
Hanya setelah saya memeriksa hasilnya sudah benar saya mengarahkan ulang ke skrip.
... tapi Kemalasan adalah kondisi pikiran .
Karena saya alergi xargs
(saya benar-benar seharusnya menggunakannya di xargs
sini) dan saya tidak ingin memeriksa cara menggunakannya, saya segera selesai untuk menemukan kembali roda seperti pada contoh di bawah ini (tl; dr).
Perhatikan bahwa karena nama file dikontrol (tanpa spasi, baris baru ...) Anda dapat dengan mudah menggunakan sesuatu seperti skrip di bawah ini.
tl; dr
Versi 1: lulus sebagai parameter opsional nomor file 1, yang terakhir, ukuran blok, file output
#!/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;
Versi 2
Memanggil bash untuk ekspansi (sedikit lebih lambat dalam pengujian saya ~ 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;
Tentu saja Anda dapat maju dan menyingkirkan seq
[ 3 ] (dari coreutils) dan bekerja secara langsung dengan variabel dalam bash, atau menggunakan python, atau kompilasi program ac untuk melakukannya [ 4 ] ...