修剪slocate结果。查找特定目录的所有实例

时间:2013-10-11 21:57:39

标签: shell replace sed

我想找到散布在我系统上的目录../foobar/的所有实例。这个目录下面可能包含数百个文件/文件夹,我不在乎。 $ slocate "/foobar/"可能会返回1000个结果,找到包含“/ foobar /”的每个完整路径名。我只想要例如。 foob​​ar /文件夹的4个位置。

如何在给定的目录级别截断slocate的输出,并且只为每个目录实例显示一行?

2 个答案:

答案 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

说明:

如果您使用VIM,

sed语法将会很熟悉。重要的是使用.*模式匹配到行尾。简化为s/foobar.*/foo/。当包含目录slashes / foobar / one时,必须使用反斜杠\来转义它们。

我们截断了每行slocate的输出,但没有截断返回的行数。

uniq -c删除所有冗余行。可选的-c标志在每个打印结果前面加上最初返回的重复出现次数。在这种情况下,指示目录下包含的文件数。

示例:

示例1

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/

示例2

改进了使用变量和句柄空格。添加| 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