如何复制 Bash 中超过 1 行的文件

How to copy files in Bash that have more than 1 line

我正在尝试将文件从一个目录(定义为下面的 $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

您可以使用 wc -l 检查文件中的行数,并使用 awk 仅从结果中去除数字。

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

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

编辑:我已根据下面的评论将 LINES 更正为行。

我提议:

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

findwc 更快地检查零大小。

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

但是,for-loop 不是必需的,因为:

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

总是 "quote" 路径字符串,因为大多数 shell 实用程序在字符串中有未转义的 shell 字符或空格时中断。很少有充分的理由使用不带引号的字符串。