发出Find命令Linux
我有一个文件夹,我想计算其中的所有常规文件,为此,我使用以下bash命令:发出Find命令Linux,linux,bash,find,Linux,Bash,Find,我有一个文件夹,我想计算其中的所有常规文件,为此,我使用以下bash命令: find pathfolder -type f 2> err.txt | wc -l 文件夹中有3个空文本文件和一个子文件夹,其中包含其他文本文件。 因此,我应该得到3分,但我得到6分,我不明白为什么。也许有一些我没有设定的选项 如果我删除子文件夹,结果得到4个解决方案忽略以点开头的文件名 要仅统计路径文件夹中的文件,请执行以下操作: find pathfolder -maxdepth 1 -type f -n
find pathfolder -type f 2> err.txt | wc -l
文件夹中有3个空文本文件和一个子文件夹,其中包含其他文本文件。
因此,我应该得到3分,但我得到6分,我不明白为什么。也许有一些我没有设定的选项
如果我删除子文件夹,结果得到4个解决方案忽略以点开头的文件名
要仅统计路径文件夹中的文件,请执行以下操作:
find pathfolder -maxdepth 1 -type f -not -path '*/\.*' | wc -l
要统计pathfolder
的所有子目录中的文件,请执行以下操作:
find pathfolder -mindepth 2 -maxdepth 2 -type f -not -path '*/\.*' | wc -l
更新:将评论转换为答案
根据收到的建议,通过使用命令touch$'foo\nbar'
创建一个虚拟文件,wc-l
对该文件名进行两次计数,如下例所示:
$> touch $'foo\nbar'
$> find . -type f
./foo?bar
$> find . -type f | wc -l
2
为了避免这种情况,请在调用wc
(anubhava's)之前去掉换行符:
或者完全避免呼叫wc
:
$> find . -type f -exec sh -c 'i=0; for f; do ((i++)); done; echo $i' sh {} +
1
要获取当前目录中没有点文件的所有文件和目录,请执行以下操作:
shopt -u dotglob
all=(*)
要仅获取目录,请执行以下操作:
dirs=(*/)
要仅统计当前目录中的非点文件,请执行以下操作:
echo $(( ${#all[@]} - ${#dirs[@]} ))
要使用
查找执行此操作,请使用:
find . -type f -maxdepth 1 ! -name '.*' -exec printf '%.0s.\n' {} + | wc -l
请告诉我们从查找路径文件夹-type f
中删除| wc-l
的输出应该会很有启发性…可能有一个隐藏的文件,您不会注意到。从中我得到了“find pathfolder-type f”:a/.DS\u存储a/1.txt a/2.txt a/3.txt a/subfolder/900.txt“a”是从开始查找的文件夹。如果文件名有换行符,则会给出错误的计数character@chatraed:带空格和换行符的文件名不是很常见,但很有可能。不,但如果文件名有换行符,则wc-l
将该文件计为2,而不是1@anubhava:创建了一些包含空格和\n
和观察到计数结果没有差异。无论如何,我赞成你的答案。谢谢。在空目录中,使用touch$'foo\nbar'
命令创建一个文件,然后运行第一个find
命令。它将打印2
而不是1
-printf.\n'
将比-exec
更高效。是的,我同意,但不幸的是,-printf
在OSX上不适用于我。是的,我想知道这是否是不可移植的。我假设您也没有-exec+
?没有,但应该是-exec printf%.0s。\n'+
。哦,哎呀,试试-exec printf%.0s。\n'{}+
。
find . -type f -maxdepth 1 ! -name '.*' -exec printf '%.0s.\n' {} + | wc -l