2016-09-28 1 views
0

Я пытаюсь использовать ls и xargs для печати определенных расширений файлов .bam and .vcf witout путь. Ниже приведено близко, но когда я | две команды ls, я получаю сообщение об ошибке ниже. Разделенный он отлично работает, за исключением того, что каждый файл печатается на новой строке (мои фактические данные содержат сотни файлов и упрощают чтение). Спасибо :).ls и xargs для вывода конкретных расширений файлов

файлы в каталоге

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 
+1

Просто дайте аргументы первым ls. Вы не можете просто передавать команды, как вам нравится. ls * .a * .b * .c ... –

+0

@SamiKuhmonen, если вы ответите, я приму это ... спасибо :) – Chris

ответ

1

Вы не можете вывести выходной сигнал в ls и распечатать его с другим выходом. Вы должны дать параметры первому, и он выведет все.

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

+0

Еще раз спасибо :). – Chris

0

ls на самом деле ничего не делает для вас, это оболочка, в которой перечислены все ваши файлы. Поскольку вы используете вывод ls, вы на самом деле уязвимы для dangerous file names.

basename может принимать несколько аргументов с опцией -a:

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

Чтобы напечатать, что в двух столбцах, можно использовать printf через xargs с sort для ... сортировки. В -z или -0 флагов по всем вызывают нулевые байты, которые будут использоваться в качестве имени файла сепараторов:

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

Если вы собираетесь делать больше обработки после печати на столбцы, вы можете заменить %b S в printf формат с %q s. Это позволит избежать непечатаемых символов на выходе, но может выглядеть немного уродливым для человеческих глаз.

Смежные вопросы