如何浏览目录并测试每个文件的字符长度?

时间:2017-10-21 19:53:21

标签: shell

我们刚开始在类中进行shell编程,我们必须编写一个程序,该程序应该列出当前目录中从3到5长度的所有名称。 我试图将代码放在一起,但它有点难。这是我来的,但它不会起作用。

for f in ls
do
if [ $f | wc -m -gt 3 -a $f |wc -m -lt 6 ]
then
echo $f
fi
done

我会感谢每一个有用的回应!

3 个答案:

答案 0 :(得分:1)

(shopt -s nullglob; echo ??? ???? ?????)

nullglob选项会导致所有不匹配的通配符变为空字符串。例如,如果您只有一个名为" test"的文件。在目录中,你得到' ???测试?????'没有nullglob

我添加了一个子shell,因此不会为整个终端会话设置nullglob。

答案 1 :(得分:0)

  1. 您需要for f in *;可以使用$(ls),但这不能正确处理空格。

  2. 您需要使用$()来实际运行测试中的命令:

    $(echo "$f" | wc -m) -gt 3
    

    注意echo;您不希望将$f作为命令运行!

  3. 避免使用test这样的逻辑运算符,例如-a;它无法进行真正的表达式解析,因此它们并不完全可靠。

  4. 只需使用${#f}而不是致电wc

答案 2 :(得分:0)

这是使用find

的单线程
find . -type f -iname "???" -o -iname "?????"

?file globbing wildcard,匹配任何单个字符,因此要搜索只有3个字符的文件,可以使用???

关于-o来自查找手册页:

  

运算符-or实现为-o,运算符-and实现为-a

因此,此示例仅返回字符长度为3或5的文件

打印名称在3到5个字符之间的所有文件的另一种变体可能是使用正则表达式,如下所示:

find . -type f -exec basename '{}' + | egrep '^.{3,5}$'

在这种情况下,find将搜索当前目录.中的所有文件,然后调用basename以删除前导斜杠,egrepgrep -E然后用于仅使用正则表达式^.{3,5}$

打印长度在3到5个字符之间的文件