저는 bash 스크립팅을 처음 접했습니다. 서로 다른 디렉터리에 있는 많은 파일을 하나의 큰 파일로 연결하는 스크립트를 작성했습니다.
#!/bin/bash
for f in foo/$1/*; do
if [ -d "$f" ]; then
for d in $f/*; do
if [ -d "$d" ]; then
file=$( echo ${d##*/} )
mkdir -p bar/$1/"$file"/fastq/
cat $d/*/fastq_pass/* >> bar/$1/"$file"/fastq/$file.fastq.gz
fi
done
fi
done
병합된 파일 중 일부에 1~2GB 크기가 누락된 것을 발견했는데, 다른 파일은 괜찮았기 때문에 이상했습니다. 내가하려고 할 때
cat foo/* >> bar/largefile.fastq.gz
손실은 없습니다. 확실히 내 대본 때문이에요. 실수는 어디에 있습니까?
답변1
효율성을 높이기 위해 파일 시스템은 블록 클러스터 형태로 디스크 공간을 할당합니다. 따라서 "1바이트" 파일이 전체 클러스터에 할당됩니다. 100개의 "1바이트" 파일을 연결하여 100바이트의 데이터를 생성하려면 여전히 하나의 클러스터가 필요합니다.
클러스터 및 블록 크기는 다양할 수 있으며 성능 분석에는 특정 애플리케이션 최적화 전용 하위 필드가 있습니다.