在 directory/bash 脚本中从大量文件中仅选择少数文件

Selecting only few files from large no of files in a directory/bash script

我有一个非常简单的问题,我在一个目录中有 10,000 个文件,名称为 simulations_0.rootsimulations_9999.root

我想将 500 个文件合并在一起,使它们的大小更大。我需要 运行 hadd,selecting simulations_0.rootsimulations_499.rootsimulations_500.rootsimulations_999.root 等等。

hadd 将多个输入文件作为命令行参数:

Synopsis
hadd outputfile inputfiles ...

我的问题是如何在 hadd 命令中一次 select 那些从 0 到 500 的文件?

您可以为此使用大括号扩展。

示例:

[user@host dir]$ bash -x
[user@host dir]$ echo foo{1..10}
+ echo foo1 foo2 foo3 foo4 foo5 foo6 foo7 foo8 foo9 foo10
foo1 foo2 foo3 foo4 foo5 foo6 foo7 foo8 foo9 foo10

正如您在上面使用 bash -x 的示例中看到的,表达式 foo{1..10} 将扩展为 space 个分隔参数。

在您的特定情况下,命令为:

hadd output_file.root simulations_{1..500}.root 

进一步使用@mashuptwice 方法:

#!/bin/bash

min=0 max=9999 incr=500

for (( i = min, j = min + incr - 1; j <= max; i += incr, j+= incr))
do
    declare -a "files=( simulations_{$i..$j}.root )"
    hadd "simulations_${i}to$j.root" "${files[@]}"
done