0

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

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

4

2 回答 2

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如果你使用 VIM,语法会很熟悉。重要的部分是使用.*模式匹配到行尾。简化为s/foobar.*/foo/. 当包含目录斜杠 /foobar/ 时,必须使用反斜杠对其进行转义\

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

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

例子:

示例 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/

注意:在 OpenSolaris 上使用 BASH shell 进行了测试。

于 2013-10-11T21:57:38.663 回答
1

如果我是你,我会用 find 来做。就像是:

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
于 2013-10-11T22:17:22.310 回答