在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是其中一个子目录中文件的名称。
有谁知道为什么会发生这种情况以及如何解决这个问题?谢谢!
答案 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
进行过滤)