bash:摆脱'。'当循环遍历以'。'开头的文件时'和'..'在一个文件夹中

时间:2010-03-31 02:41:43

标签: bash shell glob

我想遍历以'。'开头的文件。在目录x中(x可能是任何路径):

$ for file in x/.*
> do
>     echo -n $file" "
> done
x/. x/.. x/..a x/.b

摆脱x /。和x / ..的最佳方法是什么?

9 个答案:

答案 0 :(得分:5)

使用bash,您可以使用GLOBIGNORE

$ ls -1tra
..
.test1
.test
test
.

$ for i in .*; do echo $i;done
.
..
.test
.test1

$ GLOBIGNORE=".:.."
$ for i in .*; do echo $i;done
.test
.test1

答案 1 :(得分:3)

使用模式.{[^.]*,.?*},这意味着以.开头的任何名称后跟不是.的字符,或者以..开头的名称然后是一个角色。

此外,您应该在引号中写"$file",因此带空格的名称不会分开。

答案 2 :(得分:1)

另据指出, ls -A 排除。和...从列表中,不确定它是多么标准。

您还可以使用 find

find .  -mindepth 1 -maxdepth 1 -name '.*'

答案 3 :(得分:1)

只有globbing的解决方案,因此您不必麻烦使用命令替换和引用:

.!(.|)

这需要设置extglob shell选项:

shopt -s extglob

这可能是显而易见的,但!()构造除了列出的其中一个模式(由|分隔)之外还有其他任何内容。

答案 4 :(得分:0)

for file in x/.*; do echo  "$file "; done | grep -v "x/\.\{1,2\} $" | tr -d '\n'

$file之后和$ grep之前的空格非常重要。它确保您在列表之间留有空格,并确保所有内容都不会被填满。

或更一般地

for file in somedir/.*; do echo  "$file "; done | grep -v "\w/\.\{1,2\} $" | tr -d '\n'

答案 5 :(得分:0)

在Mac OS X上使用ls -A。查看本地选项实施的手册页。这个命令

ls -A | grep '^\.'

给我你正在寻找的清单。

答案 6 :(得分:0)

(1)使用2种模式: $ echo x /.??* x /.[^。] - 还有其他组合。如果使用不同的,请确保它会捕获“...”和“.a”

(2)使用GLOBIGNORE并排除2个条目: $ GLOBIGNORE ='* /。:* / ..'; echo x /.*

(3)将dotglob与GLOBIGNORE一起使用。这将自动排除。和..,但现在你必须排除“所有其余的”: $ shopt -s dotglob; GLOBIGNORE = '* / [^] *'; echo x / *

答案 7 :(得分:0)

用于x /. {[^。],。?}}

中的文件

这将匹配,例如 。一个 .zoo.17 ... ..0 ..hello

但不匹配 。 .. 文件 - 不启动与 - 点

分解......

{a,b}进行交替,首先匹配a,然后匹配b。所以我们也可以这样编写以上内容:

对于x /中的文件。[^。] * x /..?*

让我们来看看第一个:。[^。] * [^。]是一个倒置的字符类 - 没有克拉^它只匹配一个点; ^反转它所以它将匹配除dot之外的任何字符。 之后是一个星星,它将匹配0或更多任何类型的字符 所以这种模式。[^。] *将匹配名称为的文件 - 从...开始 。 - 至少两个字符长 - 第二个角色不是。 从上面的例子中,它匹配: 。一个 .zoo.17

现在让我们来看看第二个:..?* 的?匹配任何字符(但不是0个字符)。我们对这位明星很熟悉。 所以这个模式..?*将匹配具有名称的文件 - 从...开始 .. - 至少三个字符长 从上面的例子中,它匹配: ... ..0 ..hello

由于交替的工作方式,第一组中的文件将首先匹配 - 它们不会与第二组中的文件进行整理。

答案 8 :(得分:0)

另一个选择是保持globbing简单并明确删除不需要的路径:

for file in x/.* ; do
    [[ $file == */. || $file == */.. ]] && continue
    echo -n "$file "
done