我是 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-2 GB,这很奇怪,因为其他文件都正常。当我尝试做的时候
cat foo/* >> bar/largefile.fastq.gz
没有损失。所以这肯定是因为我的剧本。哪里出错了?
答案1
为了提高效率,文件系统以块簇的形式分配磁盘空间。因此,“1 字节”文件将被分配整个簇。连接 100 个“1 字节”文件,生成 100 字节的数据仍然需要一个簇。
簇和块的大小可能会有所不同,性能分析有一个子领域专门用于针对特定应用程序进行优化。