1

在 Linux 中,我试图监视当前目录的所有子目录并输出它们的文件数。我目前拥有的命令是:

watch 'for FILE in `find . -maxdepth 1 -mindepth 1 -type d | grep -v "unwanted\|directories\|here"`; do echo -n $FILE " "; find $FILE -type f | wc -l; done | column -t'

这工作得很好,除了偶尔我得到这个错误,

find: `FILE_NAME': No such file or directory

其中 FILE_NAME 是其中一个子目录中的文件名。

有谁知道为什么会发生这种情况以及如何解决它?谢谢!

4

2 回答 2

1

这仅使用 bash 内置函数(但 AFAIK 唯一的 bashism 是 export -f,所以如果你想将它弄成丑陋的、不可读的单线,你可以使用 /bin/sh)

#!/bin/bash
myfunc(){
for DIR in "$1/"*; do
    case "$DIR" in
        unwanted|dirs)continue;;
        *)[ -d "$DIR" ] && { 
            printf "%30s    " "$DIR"
            i=0
            for FILE in "$DIR/"*; do
                [ -f "$FILE" ] && i=$((i+1))
            done
            echo $i
        };;
    esac
done
}
export -f myfunc
watch myfunc "$HOME"

请注意,任何可能是带空格的文件名的内容都用双引号引起来,以防止尝试统计 2 个目录:Program 和 Files 而不是“Program Files”。最好的做法是双引号可能有分隔符的变量(顺便说一句,文件名中可以​​有制表符和换行符+一些非常奇怪的东西——除了 "/" 之外几乎没有)

于 2013-05-16T01:32:23.333 回答
0

您的命令不处理文件名中的空格。

避免运行for x in $(find)...,或者至少$'\n'在运行循环时将 IFS 设置为。

由于您似乎只关心直接子目录,因此您甚至不需要使用find循环值:

watch 'for FILE in *; do [ -d "$FILE" ] && { echo -n $FILE " "; find $FILE -type f | wc -l; } done | column -t'

(如果您需要更具体的匹配,您可以使用更复杂的模式代替*,或者甚至echo "$FILE" | grep在循环内过滤)

于 2013-05-15T21:50:31.420 回答