我想遍历以'。'开头的文件。在目录x中(x可能是任何路径):
$ for file in x/.*
> do
> echo -n $file" "
> done
x/. x/.. x/..a x/.b
摆脱x /。和x / ..的最佳方法是什么?
答案 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