如何 运行 需要两种不同类型的输入文件的命令(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.ext
和 b.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
- 查找具有该扩展名的所有文件。
- 对于每个文件
- 不带扩展名提取文件名
- 运行 命令
所以:
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' _
我已经通过 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.ext
和 b.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
- 查找具有该扩展名的所有文件。
- 对于每个文件
- 不带扩展名提取文件名
- 运行 命令
所以:
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' _