Shell 计算目录中名称为空的文件号

Shell 计算目录中名称为空的文件号,shell,unix,Shell,Unix,当目录名中的名称为空时,它不起作用。这里有谁能告诉我,我必须如何编辑这个shell脚本,以便这样的目录名也能被接受来计算它的文件内容吗? 谢谢我找到了我必须考虑的解决方案: 这将适用于所有类型的文件名: #!/bin/bash SAVEIFS=$IFS IFS=$(echo -en "\n\b") for i in $(find . -maxdepth 1 -type d); do echo -n " $i: "; (find $i -type f | wc -

当目录名中的名称为空时,它不起作用。这里有谁能告诉我,我必须如何编辑这个shell脚本,以便这样的目录名也能被接受来计算它的文件内容吗?
谢谢

我找到了我必须考虑的解决方案:


这将适用于所有类型的文件名:

  #!/bin/bash
  SAVEIFS=$IFS
  IFS=$(echo -en "\n\b")
  for i in $(find . -maxdepth 1 -type d); do
    echo -n " $i: ";
    (find $i -type f | wc -l) ;
  done
  IFS=$SAVEIFS
工作原理
  • find-maxdepth 1-类型d

    这会像您刚才所做的那样查找目录

  • -exec sh-c'printf“%s:%i\n”“$1”“$(查找“$1”-键入f | wc-l)”计数器{}

    这会将每个目录名提供给一个shell脚本,该脚本对文件进行计数,这与您所做的类似

    这里有一些技巧:
    计数器{}
    作为参数传递给shell脚本<代码>计数器
    变为
    $0
    (仅在shell脚本生成错误时使用。
    find
    {}
    替换为它找到的目录名,这将作为
    $1
    对shell脚本可用。这样做对于所有类型的文件名都是安全的

    请注意,脚本中使用
    $1
    时,它都在双引号内。这可以保护它进行分词或其他不需要的shell扩展


您的代码存在中所述的常见问题

在您的情况下,您可以这样做:

find . -maxdepth 1 -type d -exec sh -c 'printf "%s: %i\n" "$1" "$(find "$1" -type f | wc -l)"' Counter {} \;

谢谢,但是你能告诉我,如果我的解决方案(1)在特定的目录/文件名中出错了吗?我确实得到了要求的结果。仍在学习bash shell。这在包含换行符的名称上仍然失败。为什么要将
\b
添加到
IFS
find . -maxdepth 1 -type d -exec sh -c 'printf "%s: %i\n" "$1" "$(find "$1" -type f | wc -l)"' Counter {} \;
for i in */; do 
    echo -n "${i%/}: " 
    find "$i" -type f | wc -l 
done