1

我在一个目录中有一堆文件,其名称包含数字。

/mnt/exp-data/6/instrument/caen2018/stage0/S0Test_26060_500ns_CW_0ns_CBT_0ns_DEBT.root
/mnt/exp-data/6/instrument/caen2018/stage0/S0Run_26061_500ns_CW_0ns_CBT_0ns_DEBT.root
/mnt/exp-data/6/instrument/caen2018/stage0/S0Test_26063_500ns_CW_0ns_CBT_0ns_DEBT.root
/mnt/exp-data/6/instrument/caen2018/stage0/S0Run_26065_500ns_CW_0ns_CBT_0ns_DEBT.root

我想做的是找到丢失的文件,然后对这些文件做一些事情。26062在上述情况下,26064缺少包含 numbers 的文件。

到目前为止,我正在做以下事情

#___________________________________________________________________________________________________________________________
#-3-Find the missing runs
    REPLAYED_RUNS_DIR=/ /mnt/exp-data/6/instrument/caen2018/stage0
    echo "..........Looking for non replayed runs in the range $smallest_run-$biggest_run"
    for (( i=$smallest_run; i<=$biggest_run; ++i));do
        filename="$REPLAYED_DATA_DIR/*$i*.root"
        #echo $filename
        if [ ! -f $filename ]; then
             echo "Run $i does not exist."
             ./produce_file $i
        fi
    done

这个片段设法找到丢失的文件,但是我有一些问题:

  1. 在某些情况下,对于确实存在的文件,我会收到以下错误,但我不知道为什么。

./check_missing.sh: line 53: [: /mnt/exp-data/6/instrument/caen2018/stage0/S0Run_25829_500ns_CW_0ns_CBT_0ns_DEBT.root: binary operator expected

  1. 如果我取消注释echo filename,我会得到文件的全名和目录作为输出,就好像我在做ls instead of echo`。这是可以预期的吗?
  2. 有没有更好的方法(即更快、更有效)来做我想做的事情?
4

2 回答 2

1

这是一个以更大规模的方式执行此操作的脚本。

#!/bin/bash
d="path/to/directory"
start=$1
end=$2

join -v1 <(
    seq "$start" "$end"
) <(
    find "$d" -type f -printf "%f\0" |
    awk -F"/" -v RS="\0" '{split($NF,a,"_"); print a[2]}' | sort
) | xargs -r -n1 echo ./produce_file

join -v1 file1 file2file1将输出not in的所有行file2。代替这两个文件,使用进程替换,我们将要测试的序列和文件名按find,过滤awk以获取其中的数字并最终排序,因为需要join排序的输入。

最后,您可以将结果通过管道传输到您的脚本produce_file-r代表--no-run-if-empty它是一个 GNU 扩展,如果前一个命令没有给出参数,则可以避免使用空输入执行一次。

测试后删除echo。如果您的脚本可以处理多个数字参数,请-n1同时删除,以一次处理所有参数。


测试:

> mkdir -p path/to/directory
touch path/to/directory/S0Test_26060_0ns_CBT_0ns_DEBT.root
touch path/to/directory/S0Run_26061_500ns.root
touch path/to/directory/S0Test_26063_500ns_CW.root
touch path/to/directory/S0Test_26065_500ns.root
touch path/to/directory/S0Test_30000_500ns.root
> bash test.sh 26060 26065
./produce_file 26062
./produce_file 26064
于 2020-10-07T01:57:20.937 回答
0

我找到了另一种方法来使用find[ -z "$filename"]检查是否find返回了一个空条目。

for (( i=$start; i<=$endn; ++i ));do
    filename=`find "$DIR" -type f -name "*$i*"`
    if [ -z "$filename" ]; then
        echo "File $i does not exist."
    fi
done
于 2020-10-07T17:05:23.027 回答