如何编写一个Bash程序,搜索目录并列出编号后缀最大的文件?

时间:2012-10-12 19:32:24

标签: linux bash shell

我正在尝试编写一个程序,它将搜索主目录子目录并列出最后编号最大的文件。例如:filename_100。

find . -name "*_*" | sort -n | tail

2 个答案:

答案 0 :(得分:0)

sort从字符串的开头开始排序,因此您无法在不首先拆分文件名的前导部分的情况下使用它。这个循环会做到这一点;它会在_之后打印出文件名的一部分,然后是完整的文件名。

for fn in `find . -name '*_*'`; do
    echo "${fn##*_} $fn"
done

然后,您可以将输出传输到sorttail以获取最大数字,然后传输到cut以仅选择文件名本身。

for fn in `find . -name '*_*'`; do
    echo "${fn##*_} $fn"
done | sort -n | tail -n 1 | cut -d' ' -f 2-

然后你需要在下划线之前提取文件名的一部分。这可能最好通过将最后一部分的结果存储在变量

中来完成
largest_filename="$(for fn in `find . -name '*_*'`; do
    echo "${fn##*_} $fn"
done | sort -n | tail -n 1 | cut -d' ' -f 2-)"

之后,您可以使用bash的后缀删除来删除下划线后的部分,然后列出共享该前缀的所有文件。

largest_filename="$(for fn in `find . -name '*_*'`; do
    echo "${fn##*_} $fn"
done | sort -n | tail -n 1 | cut -d' ' -f 2-)"
ls ${largest_filename%_*}_*

答案 1 :(得分:0)

tmp1=$(mktemp)
#retrieve largest suffix
find . -name '*_*' | xargs -n 1 basename | awk -F'_' '{print($NF, $0)}' | sort -k1,1 -n -r | awk '{print($1)}' | head -1 > $tmp1
tmp2=$(mktemp)
#retrieve file names containing largest suffix
join -o2.2 -1 1 -2 1  $tmp1 <(find . -name '*_*' | xargs -n 1 basename | awk -F'_' '{print($NF, $0)}' | sort -k1,1 ) > $tmp2
join -o2.1,2.2 -1 1 -2 1 -t"_" $tmp2 <(find . -name '*_*' | xargs -n 1 basename | sort -k1,1 -t"_")