bash for loop:无法打开文件

时间:2015-07-31 08:43:37

标签: bash

我有许多目录包含多个文件,每个目录遵循严格的命名约定。我试过这个循环:

for s in /home/admin1/phd/results_Sample_*_hg38_hg19/Sample_*_bwa_LongSeed_sorted_hg38.bam; do 
    bedtools genomecov -ibam $s > $s
done

但是获取每个文件:

Failed to open file

我无法看到错误

1 个答案:

答案 0 :(得分:3)

请注意,如果要将输出重定向到输入文件,bash将在进程启动之前截断文件。像这样:

cat file > file

将导致空文件。这意味着你松散它的内容。

这是因为bash将在启动命令之前打开所有io重定向主题的文件。如果您使用> bash将另外截断文件为零长度。我不知道bedtools但我想它希望非空文件作为输入,这就是消息的原因。

关于循环。通常,像你一样循环遍历glob表达式的结果并不是一个好主意。这是因为文件名可能包含bash的内部字段分隔符,这会导致不一致的结果。

我建议改为使用find

find /home/admin1/phd/results_Sample_*_hg38_hg19 \
    -maxdepth 1 \
    -name 'Sample_*_bwa_LongSeed_sorted_hg38.bam' \
    -exec bash -c 'bedtools genomecov -ibam "{}" > "{}.copy"' \;