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

Shell 修剪槽形结果。查找特定目录的所有实例,shell,replace,sed,Shell,Replace,Sed,我想找到分散在我系统中的目录。/foobar/的所有实例。这个目录下可能包含数百个我不关心的文件/文件夹$slocate“/foobar/”可能返回1000个结果,查找包含“/foobar/”的每个完整路径名。我只想要foobar/文件夹的例如4个位置 如何在给定的目录级别截断slocate的输出,并为目录的每个实例仅显示一行?回答: 使用slocate,然后使用sed截断每个结果,最后使用uniq-c $ slocate "foobar/" | sed 's/\/fooba

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

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

回答: 使用slocate,然后使用sed截断每个结果,最后使用uniq-c

$ slocate "foobar/" | sed 's/\/foobar\/.*/\/foobar\//' | uniq -c
改进: 使用局部变量。此迭代还处理带有空格“”的搜索词。 (见例2)


说明:
sed
如果您使用VIM,您将熟悉语法。重要的部分是使用
*
将模式匹配到行尾。这是
s/foobar.*/foo/
。当包含目录斜杠/foobar/时,必须使用反斜杠
\
对其进行转义

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

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

示例: 例1 例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上进行了测试。

如果我是你,我会使用find进行测试。比如:

find [startDir] -type d -name 'foobar'
这将递归地在
startDir
下找到名为
foobar
的所有目录

例如:

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

很好的选择。目前,我有950000个文件跨越多个ZFS文件系统(在单个池中)。slocate速度更快,但我两者都用。正在进行认真的房屋清理。偏向于我自己的答案。有一段时间我特别想要这个,必须自己解决。”“slocate”是对“find”的恭维,当然不是替代品。
find [startDir] -type d -name 'foobar'
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