我想找到../foobar/
分散在我系统上的所有目录实例。该目录下可能包含数百个文件/文件夹,我不在乎。$ slocate "/foobar/"
可能会返回 1000 个结果,查找包含“/foobar/”的每个完整路径名。我只想要例如。foobar/ 文件夹的 4 个位置。
如何截断slocate
给定目录级别的输出,并且只为目录的每个实例显示一行?
使用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。在这种情况下,指示目录下包含多少个文件。
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/
注意:在 OpenSolaris 上使用 BASH shell 进行了测试。
如果我是你,我会用 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