linux 新手用户请看这里;我正在创建一个循环,它将遍历所有目录文件夹,并通过回显它们的名称并提取名称的总长度,并将回显存储在 wc 中后将其回显到控制台。
如何添加另一个条件,以便如果总长度小于 5 则打印出来,否则通过?
我已经尝试过以下方法:
for i in *
do
if [ -d "$i" ]
then
if (echo n "$i" | wc -m < 5)
then
wc
fi
fi
done
打印出以下内容:
zsh: no such file or directory: 5
zsh: no such file or directory: 5
zsh: no such file or directory: 5
zsh: no such file or directory: 5
...
...
如何获取父目录内的文件,以便我可以在给定条件下访问子目录文件。
for i in *
do
if [ -d "$i" ]
if (( $( echo n "$i" | wc -m ) == 76 ))
then
find $i
fi
done
打印父目录中的文件
答案1
如果您想在所有目录中搜索名称不超过五个字符的目录,可以使用命令来完成find
。不需要显式循环:
find -type d \( -name '??????*' -o -print \)
解释
-type d
- 只考虑目录项\( ... \)
- 将这些组合在一起item1 -o item2
- 如果item
失败则执行item2
-name '??????*'
- 匹配六个字符或更多字符的名称-print
- 打印当前项目名称
综上所述,首先我们只匹配目录。下一部分匹配至少有六个字符的项目(目录),如果匹配失败则打印出项目(目录)名称。
答案2
尝试这个:
for i in *
do
if [ ${#i} -gt 5 ]; then
echo $i: ${#i};
fi;
done
答案3
注意:您的标题提到“长度大于”,但是您的代码示例使用小于符号<
。我在这里假设是后者 - 如果你想要前者,请更改-lt
为-gt
由于您使用的是 zsh,因此您可以使用其更直接地执行此操作全局限定符,根本不需要显式循环:
限定符
/
仅将结果限制为目录(nullglob)限定符
N
用于在没有匹配文件的情况下抑制错误(可选)
D
如果要包含隐藏目录,请添加限定符。e:cmd:
仅返回那些cmd
返回 true的文件的限定符
其中cmd
是通过变量应用于每个匹配文件名的 shell 表达式REPLY
- 对于您的情况,您可以使用扩展测试表达式来测试结果的[[ $#REPLY -lt 5 ]]
长度,而不需要外部命令。所以#
wc
print -rC1 *(/Ne:'[ $#REPLY -lt 5 ]':)
要使其通过子目录递归,请使用**/*
“globstar”模式,并REPLY
在执行长度比较之前从变量中删除前导路径组件:
print -rC1 **/*(/Ne:'[ ${#REPLY##*/} -lt 5 ]':)
man zshexpn
详情请参阅。
答案4
@tink 出色地提供了正确的代码来帮助我找到解决方案。
该脚本的工作原理:
for i in *
do
if [ -d "$i" ]
if (( $( echo n "$i" | wc -m ) > 75 ))
then
echo "$i"
fi
done