循环遍历所有文件目录并抓取长度大于5的文件

循环遍历所有文件目录并抓取长度大于5的文件

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

相关内容