将目录更改为 find 中文件的位置,然后运行上面两层的脚本(就好像它在同一目录中一样) - bash

将目录更改为 find 中文件的位置,然后运行上面两层的脚本(就好像它在同一目录中一样) - bash

问题:

你好,我正在尝试循环遍历多个目录中的每个 *.faa 文件(例如 /path/to/*.faa)

然后,使用脚本(./script.py),就好像该脚本与 *.faa 文件位于同一目录中一样,这可以用 shellscript 实现吗?

我尝试过的:

for FAA in $(find . -name "*.faa")
do
    cd ../$FAA
    python3 ../script.py
done

我已经尝试过对此的变体,但是将目录更改为文件不起作用,但我不知道访问该目录的方法。

期望的输出:

对于每个.faa 文件,在多个目录中,例如/path/to/1.faa、path/2/2.faa,运行上面两级目录中的脚本。就好像它与每个 *.faa 文件位于同一目录中,或者如果不可能,那么实现类似目标的最佳解决方案是什么?

答案1

find . -type f -name '*.faa' -execdir python3 ../script.py ';'

这将python3 ../script.py在以下目录中执行每个找到文件作为工作目录。

由于您的文字和代码有些冲突,我不确定它是否应该是../script.py../../script.py

script.py另请注意,只有当文件在指定目录中实际可用时,这才有效。提供脚本文件的绝对路径可能更安全:

find . -type f -name '*.faa' -execdir python3 /path/to/script.py ';'

.faa上面的代码将为每个找到的文件执行脚本,即使目录中有多个文件也是如此。要对其中至少包含一个文件的每个目录仅执行一次脚本.faa

find . -type d -exec sh -c '
    for dir do
        set -- "$dir"/*.faa
        if [ "$#" -gt 0 ]; then
            ( cd "$dir" && python3 /path/to/script.py )
        fi
    done' sh {} +

这将为每个找到的目录执行一个简短的 shell 脚本。该脚本会查看目录以查看.faa其中是否有任何文件。如果存在,则以该目录作为工作目录执行 Python 脚本。

有关的:

相关内容