Linux watch命令“没有这样的文件或目录”

时间:2013-05-15 21:05:22

标签: linux shell command-line

在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是其中一个子目录中文件的名称。

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

2 个答案:

答案 0 :(得分:1)

这只使用bash builtins(但AFAIK唯一的基础是导出-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"

请注意,任何可能是带空格的文件名都是双引号,以防止尝试使用stat 2目录:Program和Files而不是“Program Files”。最好的做法是双引号有可能有分隔符的变量(顺便说一句,你可以在文件名中加上标签和换行符+一些非常奇怪的东西 - 除了“/”之外的任何东西)

答案 1 :(得分:0)

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

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

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

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

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