用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)}
...