Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用bash获取一组目录中某个文件类型的最高后缀(或前缀)的最干净方法?_Bash_Unix - Fatal编程技术网

用bash获取一组目录中某个文件类型的最高后缀(或前缀)的最干净方法?

用bash获取一组目录中某个文件类型的最高后缀(或前缀)的最干净方法?,bash,unix,Bash,Unix,我有一组跨多个目录的数据文件,格式为 ls lcp01/output/ > dst000.dat dst001.dat ... dst075.dat nn000.dat nn001.dat ... nn036.dat aa000.dat aa001.dat ... aa040.dat 也就是说,有一组目录lcp01到lcp25,它们的输出文件夹中有一组不同的数据文件。我想知道每个目录中最大的dstXXX.dat文件数是多少(在所示的示例中,结果是75) 我写了一个脚本实现了这一点,但我对

我有一组跨多个目录的数据文件,格式为

ls lcp01/output/
> dst000.dat dst001.dat ... dst075.dat nn000.dat nn001.dat ... nn036.dat aa000.dat aa001.dat ... aa040.dat
也就是说,有一组目录
lcp01
lcp25
,它们的输出文件夹中有一组不同的数据文件。我想知道每个目录中最大的
dstXXX.dat
文件数是多少(在所示的示例中,结果是
75

我写了一个脚本实现了这一点,但我对最后一步感到有点不满意:

#!/bin/bash

for i in `seq -f "%02g" 1 25`; #specify dir extensions 1 through 25
do
    echo " "
    echo $i
    names=($(ls lcp$i/output | grep dst )) #dir containing dst files

    NUMS=()
    for j in "${names[@]}";
    do
            temp="$(echo $j | tr -dc '0-9' && printf " ")" # record suffixes for each dst file
            NUMS+=("$((10#$temp))") #force base 10 interpretation of dst suffixes
    done

    numList="$(echo "${NUMS[*]}" | sort -nr | head -n1)"
    echo ${numList:(-3)} #print out the last 3 characters of the sorted list - the largest file suffix
done
最后两个步骤组织输出索引列表,然后显示该列表的最后3个字符,这将是我的最大文件号(前提是文件号小于100)


有没有更干净的方法?理想情况下,我希望更多地控制输出格式,但主要是读取最后3个字符的步骤。我希望能够输出最大的数字,这应该是列表的最后一个元素,但我不知道如何输出。

您可以执行以下操作:

for d in lc[0-9][0-9]; do find $d -name 'dst*.dat' -print | sort -u | tail -n1; done
上述命令仅在编号具有相同位数(dst001..999.dat)时有效,因为它被排序为字符串;如果情况并非如此:

for d in lc[0-9][0-9]; do echo -n $d: ; find $d -name 'dst*.dat' -print | grep -o '[0-9]*.dat' | sort -n | tail -n1; done

使用文件名扩展

for d in lcp*/output; do
    files=( $d/dst*.dat )
    file=${files[-1]}
    [[ -e $file ]] || continue
    file=${file#dst*}
    echo ${file%.dat}
done
或使用扩展选项将图案限制为数字

shopt -s extglob
... lcp*([0-9])/output
... $d/dst*([0-9]).dat
...
    file=${file##dst*(0)}
...