Bash 脚本在循环中查找最长最短文件名

Bash 脚本在循环中查找最长最短文件名

嗨,我有一个作业,我试图在这个循环中获得最长和最短长度的文件名,我尝试使用 awk 管道,但它不起作用,它总是用文件名的字符串计数写入所有文件,我需要循环遍历该数组并记录最短的文件名最长的索引需要检查该路径中最长和最短的脚本文件名,dirs 数组有,我必须仅按文件名对其进行排序,但输出需要像这样最长的文件名 = 15 个字符 /usr/sbin/update-info-dir

它的工作原理现在最长的文件名 = 3 个字符 /usr/sbin/ufw

最长文件名 =22 个字符 /usr/sbin/update-ca-certificates

最长文件名 =15 个字符 /usr/sbin/update-info-dir

最长文件名 =16 个字符 /usr/sbin/update-initramfs

最长文件名 =13 个字符 /usr/sbin/update-locale

最长文件名 = 11 个字符 /usr/sbin/update-mime .... 并扫描存储在数组中的所有文件,如下所示我想仅显示最长和最短的文件,路径与上面相同

答案1

截至撰写本文时,您对脚本的要求还相对不清楚。

我知道您必须使用数组,并且必须按文件名和路径长度排序。

这个 scriptlet 正是这样做的,但是考虑到您的示例,我不能 100% 确定您是否需要专门循环数组,或者以其他方式构造数组。另外,我不明白你对 的使用$PATH,因此我现在省略了:

files=( $(find . -type f | awk '{ print length, $0 }' | sort -n -s | cut -d' ' -f2-) )

echo "shortest: ${files[0]}"
echo "longest: ${files[-1]}"

请注意,该 scriptlet 至少需要 Bash 版本 4.2(用于数组中的负索引)。它搜索当前目录,您可以将目录指定为 的第一个参数find

如果必须使用循环,则可以简单地不对数组进行排序,而是循环遍历该数组并记录最短和最长的索引。尚不清楚这是否是一项要求。通过循环数组来执行此操作没有多大意义,因此除非是必需的,否则我建议不要这样做。

答案2

显示最短:

awk '{split($0,items,":");for (item in items){print length(items[item])" "items[item]}}'<<<"$PATH"|sort -nk1|head -n1

显示最长:

awk '{split($0,items,":");for (item in items){print length(items[item])" "items[item]}}'<<<"$PATH"|sort -nk1|tail -n1

相关内容