ls 和 xargs 输出特定的文件扩展名

ls and xargs to output specific file extentions

我正在尝试使用 lsxargs 打印特定的文件扩展名 .bam and .vcf witout the path。下面是关闭的但是当我 | 两个 ls 命令时我得到下面的错误。分开它工作正常,除了每个文件都打印在一个换行符上(我的实际数据有数百个文件并且更容易阅读)。谢谢 :)。

目录中的文件

1.bam
1.vcf
2.bam
2.vcf

命令错误

ls /home/cmccabe/Desktop/NGS/test/R_folder/*.bam | xargs -n1 basename | ls /home/cmccabe/Desktop/NGS/test/R_folder/*.vcf | xargs -n1 basename >> /home/cmccabe/Desktop/NGS/test/log
xargs: basename: terminated by signal 13

期望输出

1.bam 1.vcf
2.bam 2.vcf

您不能将输出通过管道传输到 ls 并让它与其他输出一起打印。您应该将参数提供给第一个,它将输出所有内容。

ls *.a *.b *.c | xargs ...q

ls 目前并没有真正为您做任何事情,shell 列出了您的所有文件。由于您在传输 ls 的输出,因此您实际上容易受到 dangerous file names.

的攻击

basename 可以使用 -a 选项接受多个参数:

basename -a "path/to/files/"*.{bam,vcf}

要在两列中打印,您可以通过 xargs 使用 printf,使用 sort 进行...排序。 -z-0 标志导致空字节被用作文件名分隔符:

basename -az "path/to/files/"*.{bam,vcf} | sort -z | xargs -0n 2 printf "%b\t%b\n"

如果您打算在打印到列后进行更多处理,您可能需要将 printf 格式中的 %b 替换为 %q。这将转义输出中的不可打印字符,但在人眼中可能看起来有点难看。