如何使用shell脚本计算目录中的隐藏文件?

时间:2014-06-11 17:57:25

标签: bash shell scripting grep

我已使用此代码

#!/bin/bash

ls -l
echo -n "Number of simple files : "
ls -l | egrep '^-' | wc -l 
echo -n "Number of directories : "
ls -l | egrep '^d' | wc -l
echo -n "Number of hidden files : "
ls -la | egrep '^.*\.$' | wc -l
echo -n "Number of hidden directories : "
ls -la | egrep '^d.*\.$' | wc -l
echo " End"

虽然我可以理解前两个egrep是如何工作的,但我能弄清楚最后一个是怎样的 两个工作。更具体地说这是什么意思'^.*\.$'? 我想要一个以。开头的文件。 (隐藏文件)然后我应该如何塑造我的正则表达式?

5 个答案:

答案 0 :(得分:7)

您根本不应该使用grep(或ls)完成此任务。请参阅http://mywiki.wooledge.org/ParsingLs,深入讨论ls如何永远用于向人类进行互动展示。

all_files=( * )            # includes directories
directories=( */ )         # directories only
hidden_files=( .* )        # includes directories
hidden_directories=( .*/ ) # directories only

echo "Number of files: $(( ${#all_files[@]} - ${#all_directories[@]} ))"
echo "Number of directories: ${#directories[@]}"
echo "Number of hidden files: $(( ${#hidden_files[@]} - ${#hidden_directories[@]} ))"
echo "Number of hidden directories: $(( ${#hidden_directories[@]} - 2 ))"

上次计算中的- 2是要移除...,它们将始终存在。

答案 1 :(得分:1)

请注意,为此目的解析ls输出的方法是错误的。请参阅@Dharles Duffy的答案以获得更好的选择。要回答你的问题,并解释一下正则表达式:

'^.*\.$'表示

^     // From the beginning of the string
.*    // match zero or more of any character
\.    // match one literal full-stop
$     // end of the string

我不确定你的意思是什么?#34;秘密"文件,但如果你的意思是一个隐藏的文件,即一个以.开头,然后是文件名,那么正则表达式将是

'^\..*$'

请注意,这不是在解析ls输出时,而是仅用于文件或目录名称,而在两者之间无法辨别。

答案 2 :(得分:1)

最后两项工作不正确,但

ls -la | egrep '^.*\.$' | wc -l
ls -la | egrep '^d.*\.$' | wc -l

return 2

ls -la | egrep '^.*\.$' 
ls -la | egrep '^d.*\.$' 

返回

drwxr-xr-x  7 root root  4096 date time .
drwxr-xr-x 31 root root  4096 date time ..

变体:

secret files:
ls -la | grep '^-' |awk '{print $9}' |egrep '^\.[^\.]' |wc -l
secret dirs:
ls -la | grep '^d' |awk '{print $9}' |egrep '^\.[^\.]' |wc -l

答案 3 :(得分:0)

正则表达式不起作用,因为'^.*\.$'匹配行尾的点。使用这些命令来计算隐藏的文件和目录:

ls -ld .* | egrep '^-' | wc -l
ls -ld .* | egrep '^d' | wc -l

请注意,egrep '^d'也匹配...,因此您需要从结果中减去2:

ls -ld .* | egrep '^d' | wc -l | awk '{print $1 - 2}'

备选方案:

ls -ld .* | egrep '^d' | tail -n +3 | wc -l
echo $(($(ls -ld .* | egrep '^d' | wc -l) - 2))

答案 4 :(得分:0)

find $THE_DIRECTORY -maxdepth 1 -type f -name '.*' | wc --lines

如果你想找到符号链接,你可能想要使用-L。