FORUMCategory: Generalfinding BAM files with ls and xargs
rcorbett Staff asked 2 years ago

  • Hi all,
    I have a list of libraries in libs.txt and I know the bam files are in /path/to/bamFiles/ but I don’t know the name of the folder each bam file is in.
    When looking for just one BAM by library name I can run this:

    ls  /path/to/bamFiles/*/myLib*bam

    but when I try to loop over a list of libraries I get “no such file or directory” errors:

    cat libs.txt | xargs -i ls /path/to/bamFiles/*/{}*.bam

    ls: cannot access /path/to/bamFiles/*/oneLib*bam: No such file or directory

    3 Answers
    rcorbett Staff answered 2 years ago

  • It turns out that I can get around the error above by calling a new shell command within the xargs command:

    cat libs.txt | xargs -i sh -c "ls /path/to/bamFiles/*/{}*.bam"
    jrosner Staff answered 2 years ago

  • Another method would be to pipe the output from the libraries file into a loop, then search for it using the find command, like so:

    cat mylibs.txt | while read lib; do find bams/ -name "${lib}*bam"

    This would also have the benefit of not producing ‘cannot find’ messages for those folders where a match doesn’t exist.

    MarkHahn answered 1 year ago

  • running multiple finds is crazy inefficient.  why not simply find all the bams and filter the ones you want?  ie:
    find /path/to/bamFiles -type f -name \*.bam | fgrep -f libs.txt