전제
특정 이름 형식이 [ 1 , 2 ] 인 15k 파일 에만 해당 오류가 발생하지 않아야합니다 .
다른 디렉토리에서 해당 확장을 실행 중이고 각 파일에 경로를 추가해야하는 경우 명령의 크기가 커지고 물론 발생할 수 있습니다.
솔루션 은 해당 디렉토리에서 명령을 실행하십시오.
(cd That/Directory ; cat file_{1..2000}.pdb >> file_all.pdb )
최상의 해결책 대신 내가 잘못 추측하고 파일이있는 디렉토리에서 실행하면 ...
IMHO 최고의 해결책은 Stéphane Chazelas의 것입니다 .
seq -f 'file_%.17g.pdb' 15000 | xargs cat > file_all.pdb
printf 또는 seq와 함께; 미리 캐시 된 내부의 번호 만 사용하여 15k 파일에서 테스트 된 경우 더 빠릅니다 (현재는 파일이있는 동일한 디렉토리의 OP 파일 제외).
더 많은 단어
쉘 명령 행에 더 오래 전달할 수 있어야합니다.
명령 행은 213914 자이며 15003 단어를 포함합니다
cat file_{1..15000}.pdb " > file_all.pdb" | wc
... 각 단어에 8 바이트를 추가해도 ARG_MAX
커널 3.13.0에서 보고 한 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 ] ...