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

问题描述:

我们刚开始在课堂上编写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 

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

+0

您的意思是名称应该在3到5个字符之间,或者文件的大小应该在3到5个字符之间? – melpomene

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

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

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

    注意echo;你不想运行$f作为命令!

  3. 避免使用test的逻辑运算符如-a;它不能做真正的表达式解析,所以它们不完全可靠。

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

这是使用find一个班轮:

find . -type f -iname "???" -o -iname "?????" 

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

关于-o从查找手册页:

-or被实现为-o运营商,以及运营商 - 和被实现为-a

所以这个例子将返回只有文件长度为3或5的文件

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

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

在这种情况下,find将为所有文件中搜索当前目录.内,然后调用basename以除去斜线开头,egrepgrep -E然后通过使用用于3首5个字符之间的长度的仅打印文件正则表达式^.{3,5}$

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

nullglob选项使所有非匹配的通配符被打开为空字符串。例如,如果你在目录中只有一个名为“test”的文件,你会得到'???测试?????'没有nullglob

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