我有许多目录包含多个文件,每个目录遵循严格的命名约定。我试过这个循环:
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
我无法看到错误
答案 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"' \;