ls -d .*
仅列出隐藏的“项目”(文件和目录)。 (我认为)从技术上讲,它列出了以 开头的每个项目.
,其中包括当前目录.
和上面的..
目录。
我还知道ls -A
列出了“几乎所有”项目,列出了隐藏和未隐藏的项目,但不包括.
和..
。然而,将这些组合起来并ls -dA .*
不会列出“几乎所有”我的隐藏项目。
仅列出隐藏项目时如何排除.
和?..
答案1
您可以组合除.
和..
1 之外的所有情况。这也不会因特殊文件名而阻塞:
ls -d .[!.]* ..?*
如果目录确实有太多内容,冒着命令失败的风险Argument list too long
,那么可以使用这个来代替(但是-printf '%f\n'
删除前导的选项./
特定于 GNU find 并且-maxdepth
在 POSIX 中不存在):
find . -maxdepth 1 -name '.*' ! '(' -name . -o -name .. ')' -printf '%f\n'
-print0
要处理诸如 LF 之类的特殊字符,可以使用类似的选项,但是所有工具都必须支持它(GNU 或 FreeBSD 变体都支持它,除了-printf '%f\0'
出现仅 GNU 且可以替换为-print0
但保留前导的./
):
find . -maxdepth 1 -name '.*' ! '(' -name . -o -name .. ')' -printf '%f\0'| sort -z | xargs -0 [...]
1:POSIX 指定括号开头为[!
用于否定文件名扩展中的字符,而不是[^
(如正则表达式)具有未指定的结果(即使例如巴什允许))。
答案2
答案3
如果您只想列出不带.
和 的隐藏文件..
ls -ld .[!.]*
如果您只想列出所有文件(无论是否隐藏),.
那么..
您可以使用:
ls -lA
这包括l
长列表以及A
显示隐藏和未隐藏的项目,而无需.
和..
-d
仅列出目录而不列出其内容。由于您只想列出您所在文件夹的内容,因此不需要它。
如果您不想要长列表,请删除-l
.
答案4
UNIX
您观察到的问题是由20 世纪 70 年代初期的黑客攻击造成的结果。为了减少代码大小,目录被赋予真实的目录.
,并且..
条目已被实现为当前目录和上一级目录的目录硬链接。现代文件系统具有不同的内部结构......
处理此问题的一个好方法是选择一个在表达式的匹配文件列表中不包含.
和的 shell 。..
.*
bosh
就是mksh
这样的贝壳。如果您想测试 shell,我建议您致电:
mkdir /tmp/t
cd /tmp/t
echo .*
如果结果是:
. ..
如果您得到以下结果,您的 shell 会在匹配结果中包含这些模式:
.*
你的 shell从结果中排除.
和。..
但要小心,因为这个结果也可能是由文件系统可能没有.
和..
条目引起的,所以还要检查是否:
ls -Fa
列出这些文件。
POSIX
不久前已更改,现在允许这种行为。未来的POSIX
版本可能不允许在匹配结果中包含.
和..
,因为文件系统甚至不需要物理支持这些目录。唯一的要求POSIX
是在访问此类路径时实现预期的行为。