我正在服务器上运行一个使用sbatch
工具的命令,这需要大量空间。该命令在 for 循环中使用主目录 (tq_first) 中的一些目录(一些文件)。我想知道是否有一种方法可以在循环中迭代并完全执行后删除目录?删除命令会在不干扰循环的情况下在那里工作吗?
例如对于这个循环
set -eu
export PATH=/home/bin:${PATH}
reference_dir=/mnt/scratchb/REF
for fastq_dir in fastq_first/*; do
barcode=`basename ${fastq_dir}`
cmd="cellranger count \
--id=${barcode} \
--fastqs= ${fastq_dir} \
--sample=${barcode} \
--transcriptome=${reference_dir} \
--localcores=32 \
--localmem=92"
sbatch --nodes=1 \
--cpus-per-task=32 \
--mem=96G \
--time=2880 \
-o cellranger_count.%j.out \
-e cellranger_count.%j.err \
-J cellranger_count <<EOF
cmd="rm -r $fastq_dir"
#!/bin/bash
echo "Start Cell Ranger count "`date`
echo ${cmd}
eval ${cmd}
echo "Done "`date`
cellranger count --version
EOF
done
答案1
如果我理解正确的话,你想做的是:
cellranger
为每个 fastq 目录向 Slurm提交一项作业。- 删除目录。
但是,这不是您的脚本正在做的事情。你有
cmd="cellranger count \
[. . . ]
然后你有:
sbatch --nodes=1 \
-J cellranger_count <<EOF
[. . . ]
cmd="rm -r $fastq_dir"
因此,在你实际上要从事的工作中sbatch
,$cmd
正义rm -rf $fastq_dir
与否cellrangercount...
。
无论如何,我怀疑无论如何都rm -rf "$fastq_dir"
不会工作,除非它sbatch
在同一目录中运行,所以您可能希望在for
循环中使用完整路径。例如,如果您fastq_first/
实际上是/home/echo94/data/fastq_first
,那么您应该将您更改for
为如下所示:
for fastq_dir in /home/echo94/data/fastq_first/*; do
另外,由于您只需要目录,因此可以添加斜杠以确保循环不会选择任何文件for
:
for fastq_dir in /home/echo94/data/fastq_first/*/; do
您现在拥有每个目录的完整路径,因此您可以rm $fastq_dir
从系统上的任何位置进行操作。将所有这些放在一起,这个脚本可能就是您所需要的:
for fastq_dir in /home/echo94/data/fastq_first/*/; do
barcode=`basename "$fastq_dir"`
cmd="cellranger count \
--id=${barcode} \
--fastqs= ${fastq_dir} \
--sample=${barcode} \
--transcriptome=${reference_dir} \
--localcores=32 \
--localmem=92"
sbatch --nodes=1 \
--cpus-per-task=32 \
--mem=96G \
--time=2880 \
-o cellranger_count.%j.out \
-e cellranger_count.%j.err \
-J cellranger_count <<EOF
#!/bin/bash
set -ue
echo "Start Cell Ranger count `date`"
echo "$cmd"
eval "$cmd"
echo "Done "`date`
cellranger count --version
rm -r "$fastq_dir"
EOF
done