如何 运行 需要两种不同类型的输入文件的命令(1000 次)

How to run a command (1000 times) that requires two different types of input files

我已经通过 DirectedLouvain (https://github.com/nicolasdugue/DirectedLouvain) 计算了定向模块性。我现在正尝试通过空模型测试所获得值的重要性。为此,我需要 运行 1000 次 DirectedLouvain 命令之一超过 1000 个不同的输入文件。

根据@KamilCuk 的建议,我使用了这段代码,它接受 1000 个 *.txt 输入文件并生成 1000 个 *.bin 文件和 1000 个 *.weights 文件。它完美运行:

find -type f -name '*.txt' |
while IFS= read -r file; do
   file_no_extension=${file##*/};
   file_no_extension=${file_no_extension%%.*}
   ./convert -i "$file" -o "$file_no_extension".bin -w "$file_no_extension".weights
done

现在我正在尝试使用另一个命令来获取这两种类型的文件(*.bin 和 *.weights)并生成 *.tree 文件。我已经尝试过但没有成功:

find ./ -type f \( -iname \*.bin -o -iname \*.weights \) | 
while IFS= read -r file; do
   file_no_extension=${file##*/};
   file_no_extension=${file_no_extension%%.*}
   ./community "$file.bin" -l -1 -w "$file.weights" > "$file_no_extension".tree
done

有什么建议吗?

您可以使用 find 列出您的文件并对所有文件执行命令:

find -name '*.ext' -exec ./runThisExecutable '{}' \;

如果目录中有 a.extb.ext,这将 运行 ./runThisExecutable a.ext./runThisExecutable b.ext

要测试它是否识别正确的文件,您可以 运行 它没有 -exec 所以它只打印文件名:

find -name '*.ext'
./a.ext
./b.ext

您可以使用 GNU Parallel 来 运行 在所有 CPU 核心上并行执行您的作业,如下所示:

parallel convert -i {} -o {.}.bin -w {.}.weights ::: input*.txt

最初,您可能想做一个 "dry 运行" 来展示它在不实际做任何事情的情况下会做什么:

parallel --dry-run convert -i {} -o {.}.bin -w {.}.weights ::: input*.txt

如果您因为文件太多而收到有关参数列表太长的错误,您可以像这样在 stdin 上输入它们的名称:

find . -name "input*txt" -print0 | parallel -0 convert -i {} -o {.}.bin -w {.}.weights
  1. 查找具有该扩展名的所有文件。
  2. 对于每个文件
    1. 不带扩展名提取文件名
    2. 运行 命令

所以:

find -type f -name '*.ext' |
while IFS= read -r file; do
   file_no_extension=${file##*/};
   file_no_extension=${file_no_extension%%.*}
   ./convert -i "$file" -o "$file_no_extension".bin -w "$file_no_extension".weights
done

// with find:
find -type f -name '*.ext' -exec sh -c 'f=$(basename "" .ext); ./convert -i "" -o "$f".bin -w "$f".weights' _ {} \;

// with xargs:
find -type f -name '*.ext' |
xargs -d '\n' -n1 sh -c 'f=$(basename "" .ext); ./convert -i "" -o "$f".bin -w "$f".weights' _