我已使用此代码
#!/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是如何工作的,但我能弄清楚最后一个是怎样的
两个工作。更具体地说这是什么意思'^.*\.$'
?
我想要一个以。开头的文件。 (隐藏文件)然后我应该如何塑造我的正则表达式?
答案 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。