[英]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.