“Linux监视命令”;没有这样的文件或目录;
在Linux中,我试图监视当前目录的所有子目录并输出它们的文件计数。我当前拥有的命令是:“Linux监视命令”;没有这样的文件或目录;,linux,shell,command-line,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':
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是其中一个子目录中的文件名
有人知道为什么会发生这种情况以及如何解决吗?谢谢 您的命令不处理文件名中的空格 避免在$(find).中为x运行
,或者在运行循环时至少将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
进行过滤)您的命令不处理文件名中的空格
避免在$(find).
中为x运行,或者在运行循环时至少将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
进行过滤)这只使用bash内置代码(但恐怕唯一的bashism是export-f,因此如果您想将其分解成难看、不可读的一行,可以使用/bin/sh)
请注意,任何可能是带有空格的文件名都会被双引号引起来,以防止试图统计2个目录:Program和Files,而不是“Program Files”。最好的做法是双引号引用可能有分隔符的变量(顺便说一句,文件名中可以有制表符和换行符+一些非常奇怪的东西-除了“/”)这只使用bash内置项(但实际上,唯一的bashism是export-f,因此如果您想将其转换为难看、不可读的单行代码,可以使用/bin/sh)
请注意,任何可能是带有空格的文件名都会被双引号引起来,以防止试图统计2个目录:Program和Files,而不是“Program Files”。最佳做法是双引号引用可能有分隔符的变量(顺便说一句,你可以在文件名中有制表符和换行符+一些非常奇怪的东西-除了“/”之外几乎什么都有)是否有可能文件名
被其他文件删除?find
有一个竞态条件,即在find
确定文件位于请求的目录中后,但在可以使用一个原色(在本例中,-类型f
)对其进行测试之前,可以删除该文件@chepner这可能是原因。我监视目录的原因之一是确保文件被正确清理。有解决方法吗?我不知道。这只是来自find
的一个警告,说它再也找不到它无论如何都不会报告的文件。你可以抑制find
的标准错误是find$FILE-typeF2>/dev/null | wc-l;
是否有可能FILE\u NAME
被其他东西删除了?find
有一个竞争条件,在find
确定某个文件在请求的目录中之后,但在可以使用其中一个原色(在本例中为f型)@chepner这可能是原因。我监视目录的原因之一是确保文件被正确清理。有解决方法吗?我不知道。这只是来自find
的一个警告,说它再也找不到它无论如何都不会报告的文件。你可以抑制find
的标准错误是find$FILE-type f 2>/dev/null | wc-l;
全部为真,但不清楚包含文件名的空间是否是这里的直接问题。@SirAthos感谢您的建议。当前目录(或其子目录)中没有任何空格,但我以后会记住这一点!都是真的,但不清楚包含文件名的空间是否是这里的直接问题。@SirAthos谢谢你的建议。当前目录(或其子目录)中没有任何空间,但我以后会记住这一点!