我试图将文件从一个目录(在下面定义为$ 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
答案 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字符或空格时会中断。很少有没有理由使用无引号的字符串。