代码之家  ›  专栏  ›  技术社区  ›  user5481267

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

  •  0
  • user5481267  · 技术社区  · 5 年前

    我正在尝试将文件从一个目录(下面定义为$inDir)复制到另一个目录(下面定义为$outDir),如果它们1)存在,2)在文件中有多行(这是为了避免复制空文本文件)。我可以用下面的代码做第一部分,但我很难知道如何做后一部分。我可能会使用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
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Nathan TM    5 年前

    你可以用 wc -l 检查一个文件中有多少行 awk

    lines=$(wc -l $YOUR_FILE_NAME | awk '{print $1}')
    
    if [ $lines -gt 0 ]; then 
        //copy the file 
    fi
    

    编辑:我已经根据下面的评论修改了一行又一行。

        2
  •  0
  •   krysopath    5 年前

    我提议:

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

    find 比…快 wc

    我认为它主观上比另一种解决方案更具可读性。

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

    总是“引用”路径字符串,因为当字符串中有未转义的shell字符或空格时,大多数shell util都会中断。很少有好的理由使用不带引号的字符串。