Приміщення
Ви не повинні зазнавати цієї помилки лише для 15-ти файлів із певним форматом імен [ 1 , 2 ] .
Якщо ви запускаєте це розширення з іншого каталогу і вам потрібно додати шлях до кожного файлу, розмір вашої команди буде більшим, і, звичайно, це може відбутися.
Рішення запустіть команду з цього каталогу.
(cd That/Directory ; cat file_{1..2000}.pdb >> file_all.pdb )
Найкраще рішення Якщо натомість я здогадався погано, і ви запускаєте його з каталогу, в якому знаходяться файли ...
ІМХО найкращим рішенням є стифани Шазели :
seq -f 'file_%.17g.pdb' 15000 | xargs cat > file_all.pdb
з printf або seq; протестований на 15-ти файлах, лише їх кількість всередині попереднього кешування, це навіть більш швидкий (в даний час, за винятком OP-одного з тієї ж директорії, в якій є файли).
Деякі слова більше
Ви повинні мати можливість переходити до командних рядків оболонки довше.
Ваш командний рядок має 213914 символів і містить 15003 слова
cat file_{1..15000}.pdb " > file_all.pdb" | wc
... навіть додавання 8 байтів для кожного слова становить 333 938 байт (0,3 М) набагато нижче від 2097142 (2,1 М), про який повідомляється ARG_MAX
в ядрі 3.13.0, або трохи менший 2088232 повідомляється як "Максимальна довжина команди, яку ми могли насправді використання " відxargs --show-limits
Погляньте на вашу систему на вихід
getconf ARG_MAX
xargs --show-limits
Лінь керований рішення
У таких випадках я вважаю за краще працювати з блоками навіть тому, що зазвичай виходить ефективне за часом рішення.
Логіка (якщо така є) - я дуже лінивий писати 1 ... 1000 1001..2000 і т. Д. І т.д. ...
Тож я прошу сценарій зробити це для мене.
Тільки після того, як я перевірив правильність виводу, я перенаправляю його на сценарій.
... але лінь - це стан душі .
Так як у мене алергія наxargs
страждаю (я справді мав би xargs
тут використовуватись ) і не хочу перевіряти, як це використовувати, я закінчую винахідлення колеса заново, як у наведених нижче прикладах (tl; dr).
Зауважте, що оскільки імена файлів керовані (немає пробілів, нових рядків ...), ви можете легко перейти з чимось на зразок сценарію нижче.
тл; д-р
Версія 1: передайте як необов'язковий параметр номер 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, або компілювати програму змінного струму для цього [ 4 ] ...