如何在Bash中复制多于1行的文件

时间:2019-05-13 10:21:44

标签: bash file-copying

我试图将文件从一个目录(在下面定义为$ inDir)复制到另一个目录(在下面定义为$ outDir),如果它们1)存在并且2)文件中有多于1行(这是为了避免复制)文件为空文本文件)。我能够使用下面的代码来完成第一部分,但正努力了解如何完成后一部分。我在以某种方式要求使用awk和NR,但是我对用Bash编码不是很好,因此任何帮助将不胜感激。我希望将其合并到下面,以便可以一步完成。

for i in $inDir/NVDI_500m_mean_distance_*_40PCs; do
    batch_name_dir=$i;
    batch_name=$(basename $i);
    if [ ! -f $outDir/${batch_name}.plink.gz ]; then
            echo 'Copying' $batch_name;
            find $batch_name_dir -name ${batch_name}.plink.gz -exec cp {} $outDir/${batch_name}.plink.gz \;
    else
            echo $batch_name 'already exists'
    fi
done

2 个答案:

答案 0 :(得分:1)

您可以使用wc -l来检查文件中有多少行,而awk可以仅从结果中删除数字。

lines=$(wc -l $YOUR_FILE_NAME | awk '{print $1}')

if [ $lines -gt 0 ]; then 
    //copy the file 
fi

编辑:我已根据以下评论将LINES纠正为行。

答案 1 :(得分:0)

我建议这样做:

for f in "$(find $indir -type f -name 'NVDI_500m_mean_distance_*_40PC' -not -empty)"; 
do 
  cp "$f" /some/targetdir; 
done

find的速度比wc更快,可以检查零大小。

主观上,我认为它比其他解决方案更具可读性。

但是,由于以下原因,不需要for循环

find "$indir" -type f -name 'NVDI_500m_mean_distance_*_40PC' -not -empty |\
    xargs -I % cp % /some/targetdir/%

总是“引用”路径字符串,因为大多数shell utils在字符串中存在未转义的shell字符或空格时会中断。很少有没有理由使用无引号的字符串。