如何查看目录并测试每个文件的字符长度?
问题描述:
我们刚开始在课堂上编写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
我会感谢每一个有用的回应!
答
您需要
for f in *
;可以使用$(ls)
,但这不会处理空格。-
您需要使用
$()
实际上在测试中运行命令:$(echo "$f" | wc -m) -gt 3
注意
echo
;你不想运行$f
作为命令! 避免使用
test
的逻辑运算符如-a
;它不能做真正的表达式解析,所以它们不完全可靠。只需使用
${#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
以除去斜线开头,egrep
或grep -E
然后通过使用用于3首5个字符之间的长度的仅打印文件正则表达式^.{3,5}$
答
(shopt -s nullglob; echo ??? ???? ?????)
nullglob
选项使所有非匹配的通配符被打开为空字符串。例如,如果你在目录中只有一个名为“test”的文件,你会得到'???测试?????'没有nullglob
。
我已经添加了一个子shell,因此没有为整个终端会话设置nullglob。
您的意思是名称应该在3到5个字符之间,或者文件的大小应该在3到5个字符之间? – melpomene