我正在尝试编写一个程序,该程序将搜索主目录子目录,并在末尾列出数量最多的文件。例如:filename_100。
find . -name "*_*" | sort -n | tail
sort
从字符串的开头开始排序,因此如果不首先拆分文件名的前导部分,就无法使用它。这个循环将做到这一点;它打印出_
之后的文件名部分,然后是完整的文件名。
for fn in `find . -name '*_*'`; do
echo "${fn##*_} $fn"
done
然后,您可以将输出管道传输到sort
和tail
以获得最大的数字,然后再传输到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%_*}_*
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"_")