繁体   English   中英

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

[英]Linux watch command “no such file or directory”

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

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

这仅使用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个目录:“程序和文件”而不是“程序文件”。 最好的做法是用双引号将可能有分隔符的变量加引号(顺便说一句,您可以在文件名中包含制表符和换行符,以及一些非常奇怪的东西-除了“ /”以外几乎没有其他东西)

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

避免for x in $(find)...运行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过滤)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM