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