我想找到散布在我系统上的目录../foobar/
的所有实例。这个目录下面可能包含数百个文件/文件夹,我不在乎。 $ slocate "/foobar/"
可能会返回1000个结果,找到包含“/ foobar /”的每个完整路径名。我只想要例如。 foobar /文件夹的4个位置。
如何在给定的目录级别截断slocate
的输出,并且只为每个目录实例显示一行?
答案 0 :(得分:1)
使用 slocate ,然后 sed 截断每个结果,最后 uniq -c 。
$ slocate "foobar/" | sed 's/\/foobar\/.*/\/foobar\//' | uniq -c
使用局部变量。此迭代还处理带有空格“”的搜索项。 (见例2)
$ LOOK="bazbar"
$ slocate "$LOOK"/ |sed "s/${LOOK}\/.*/${LOOK}\//" | uniq -c
sed
语法将会很熟悉。重要的是使用.*
模式匹配到行尾。简化为s/foobar.*/foo/
。当包含目录slashes / foobar / one时,必须使用反斜杠\
来转义它们。
我们截断了每行slocate的输出,但没有截断返回的行数。
uniq -c
删除所有冗余行。可选的-c标志在每个打印结果前面加上最初返回的重复出现次数。在这种情况下,指示目录下包含的文件数。
slocate "resume/" | sed 's/\/resume\/.*/\/resume\//g' | uniq -c
22 /dpool/data/2008-2010/documents/resume/
621 /dpool/data/documents/resume/
141 /dpool/data/2001-2007/documents/resume/
35 /dpool/data/2001-2007/portfolio/resume/
改进了使用变量和句柄空格。添加| head
有助于验证输出是否符合预期。
$ LOOK="Current H-Drive Backup"
$ slocate "$LOOK"/ |sed "s/${LOOK}\/.*/${LOOK}\//" | uniq | head
/dpool/backup/2011/Current H-Drive Backup/
/dpool/backup/2012/Current H-Drive Backup/
/dpool/data/avalon2010/college/Current H-Drive Backup/
/dpool/data/avalon2010/windows_docs/Current H-Drive Backup/
注意:使用BASH shell在OpenSolaris上进行测试。
答案 1 :(得分:1)
如果我是你,我会找到它。类似的东西:
find [startDir] -type d -name 'foobar'
这会在foobar
递归下找到名为startDir
的所有目录。
例如:
kent$ pwd
/tmp
kent$ tree test
test
|-- f
|-- f1
|-- f2
|-- x
| `-- test
| |-- f1
| |-- f2
| `-- f3
`-- y
3 directories, 6 files
kent$ find /tmp -type d -name 'test'
/tmp/test
/tmp/test/x/test