运行 使用 bash 中的查找功能在子文件夹上迭代的程序

Running a program iteratively on subfolders using the find function in bash

我正在尝试 运行 一个特定的程序,方法是使用 find 函数在一堆子目录中循环它,但似乎没有任何反应。这是我的代码:

for FILE in $(find ~/test -maxdepth 1 -type f -name '*.vcf'); do
    dotnet ~/Nirvana/Nirvana.dll \
     -c ~/Nirvana/Data/Cache/GRCh37/Both \
     --sd ~/Nirvana/Data/SupplementaryAnnotation/GRCh37 \
     -r ~/Nirvana/Data/References/Homo_sapiens.GRCh37.Nirvana.dat \
     -i $FILE \
     -o ~/test/annotTest/$FILE.vcf.gz 
done

使用 set -x 调试似乎指向以下行:

++ find /home/test -maxdepth 1 -type f -name '*.vcf'
+ set +x

我很确定程序的参数是正确的,因为当我只在一个文件上使用它时它们可以工作,但是循环它什么都不做。

我的代码中是否存在我没​​有发现的错误?

谢谢!

-maxdepth 1 告诉 find 只在 ~/test 中搜索,而不是它的子目录。

find 的深度概念可能有点混乱:因为您将 ~/test 作为搜索的起点,它认为深度为 0,项目直接在里面它的深度为 1,those 中的项目(即 ~/test 的子目录中的项目)的深度为 2。因此,如果您希望它在子目录中查找内容,请使用-maxdepth 2.

(只是为了让事情更混乱:如果你使用类似 find ~/test/* ... 的东西,那么 shell 会将 ~/test/* 部分扩展为 [=14 中的文件和目录列表=] 并将它们作为参数传递给 find。因此,由于每个参数都作为单独的起点提供给 find,因此在其自己的单独搜索中,每个都将被视为深度 0。在此在这种情况下,子目录 中的内容将 位于深度 1。)

实际上,既然你只想在一个级别上搜索,我就使用 shell 通配符表达式:

for file in ~/test/*/*.vcf; do

(请注意,小写或混合大小写的变量名通常是很好的做法,以避免与许多具有特殊含义的全大写名称发生冲突。)