列出除一个之外的所有目录

5

我有以下目录结构

libs logs src etc .........
  |-- logs
  |-- src
  |-- inc

“logs”目录随处可见。因此,我想列出除“logs”之外的所有目录。那么,对应的shell命令是什么呢?
类似于:
#!/bin/bash
for dir in `find * -type d`; do
    if [[ ${dir} != "{logs}*" ]]; then
        echo ${dir}
    fi
done

但是似乎这并没有起作用。

祝好, Farrukh Arshad。

2个回答

5

与其通过检查一次处理这些事情,为什么不获取所有目录并过滤掉您不想要的目录:

find * -type d | egrep -v '^logs/|/logs/'
grep 命令会简单地删除以 logs/ 开头或者包含 /logs/ 的行。
这比逐个检查每个目录要快得多。

好的。这个代码可以运行,只是想知道grep和egrep之间的区别。两者的手册相同,但在上面的命令中,egrep可以工作,但grep无法工作!!grep似乎不支持|。另外-v表示反向选择,那么^的目的是什么? - Farrukh Arshad
find 命令有 -regex 测试选项,可以避免将输出传递给 egrep(对于文件名包含换行符的情况并不安全)。 - chepner
那些有奇怪文件名的人应该受到严厉惩罚 :-) - paxdiablo
@Farrukh,grep、egrep和fgrep之间存在微妙的差异,主要在于它们如何解释搜索字符串(例如正则表达式变体)。 - paxdiablo
grep通常用于一个搜索模式,egrep用于多个模式,您可以使用|来查找某些内容或使用+来查找另一些内容。 - V H

4

如上评论中所述,您可以使用egrep和|来区分模式,或者像下面这样在find中定义所有内容

 find . -type d -print
.
./logs1
./test
./logs


$ find . -type d -not -name logs -not -name logs1  -print
.
./test

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接