【问题标题】:Running a program iteratively on subfolders using the find function in bash使用 bash 中的 find 函数在子文件夹上迭代运行程序
【发布时间】:2021-12-12 07:26:47
【问题描述】:

我正在尝试通过使用 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

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

我的代码中是否有一些我没有看到的错误?

谢谢!

【问题讨论】:

  • for FILE in $(find ~/cfile/test -maxdepth 1 -type f -name '*.vcf'); do echo "$FILE" done 的输出是什么样子的?此外,请确保文件名不包含空白字符(空格、制表符等)。如果确实如此,您的代码就会中断。
  • 嗯,运行它不会返回任何东西 - 只是转到一个空的 bash 行。编辑添加:文件名中有破折号“-”,这也会导致中断吗?
  • @vanish007 文件名中的破折号应该不是问题。 ls ~/test/*.vcf 会列出它们吗?
  • @GordonDavisson ls ~/test 将列出包含文件的文件夹,但命令 'ls ~/test/*.vcf` 表示 ls: cannot access /home/test/*.vcf: No such file or directory
  • @vanish007 -maxdepth 1 告诉find 只搜索 /home/test,而不是它的子目录。 find 认为 ~/test 位于深度 0,其中的项目(文件和目录)位于深度 1,~/test 内的项目(目录)内的项目位于深度 2。所以如果你想要它在子目录中查找东西,使用-maxdepth 2。虽然,实际上,我只是使用 shell 通配符表达式:for file in ~/test/*/*.vcf。 (请注意,小写或混合大小写的变量名称通常是很好的做法)。

标签: .net bash for-loop unix find


【解决方案1】:

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

find 的深度概念可能有点令人困惑:因为你给它~/test 作为搜索的起点,它认为它位于深度 0,直接位于其中的项目位于深度 1 ,那些中的项目(即~/test的子目录中)的深度为2。因此,如果您希望它在子目录中查找内容,请使用-maxdepth 2

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

实际上,由于您只想在单个级别进行搜索,所以我只需使用 shell 通配符表达式:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-02
    • 2020-06-03
    • 2019-12-22
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    相关资源
    最近更新 更多