如何在终端中仅显示隐藏文件?


154

我有一个包含数千个文件的目录,其中有些是隐藏的。

该命令ls -a列出了所有文件,包括隐藏的文件,但是我只需要列出隐藏的文件。

我应该使用什么命令?


1
一个简单的方法ls -ld .*ls -ald .*将起作用的方法
John Strood '18年

Answers:


189

命令 :

ls -ld .?* 

只列出隐藏文件。

说明:

 -l     use a long listing format

 -d, --directory
              list  directory entries instead of contents, and do not derefer‐
              ence symbolic links

.?* will only state hidden files 

8
您无需在其中使用两个问号,*会将其覆盖(?仅匹配任何单个字符,*匹配任意数量的字符)。
psusi 2014年

13
@psusi,我认为其目的是排除.,并..从比赛。但是,它也将排除(完全合法)单字符隐藏文件名,例如.a.1等等。也许更好的扩展范围是.!(|.)字面点,后面紧跟什么都没有或其他(单个)点,即ls -d .!(|.)
螺丝刀

@steeldriver,整洁,?? 版本不包含“。” 和“ ..”。这似乎是一个有趣的怪癖的结果:都没有?*也不会匹配一个点,但是?必须匹配某些内容,否则名称将被忽略。
psusi

要标识目录和文件,请添加F选项,即ls -ldF。?*目录名带有“ /”,而最后显示的字符文件则没有。
RCF 2014年

1
除了列出像.vim这样的隐藏文件夹之外,这几乎可以用,在这里我认为不是文件。我将其修改为ls -ldp。grep -v /仅列出隐藏文件,不列出隐藏文件夹
Fred Yang

31
ls -d .!(|.)

确实OP正在寻找什么。


1
这是如何运作的?
SarcasticSully

列出目录中带有的任何内容。并且不要列出没有翻译的任何内容。
帕特里克

1
我知道在中!(pattern-list)pattern-list是一个由a分隔的一个或多个模式的列表|,但是对我来说,您在的左侧没有任何模式感到困惑|。你能给我解释一下这种语法吗?
卡洛斯·门多萨

2
@CarlosMendoza将会变成空模式,因此就好像.没有跟在(nothing或.)之后,不包括.自身和..
muru 18/09 / 26,2

16

如果您只想将文件放在当前目录中(无需递归),则可以

echo .[^.]*

这将打印所有名称以a开头,.后跟一个或多个非点字符的文件的名称。请注意,对于名称以连续点开头的文件,此操作将失败,因此例如....foo将不会显示。

您还可以使用find

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

-mindepth我们不匹配,确保.-prune该方法find不会访问子目录。



4

使用findawk

find . -type f | awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

说明:

find . -type f ->列出当前目录中的所有文件及其路径,例如

./foo.html
./bar.html
./.foo1

awk -F"/" '$NF ~ /^\..*$/ {print $NF}'

/作为字段分隔符,awk检查是否有最后一个以点开头的字段。如果以点开头,则将打印该对应行的最后一个字段。


您可以使用find -type f。您无需明确设置搜索路径或-name "*"
terdon

3

find 对于复杂的搜索,通常比使用名称遍历更好。

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

要么

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

find . 搜索当前目录

-mindepth 1不包括在内。和..从列表中

-maxdepth 1 将搜索限制到当前目录

-name '.*' 查找以点开头的文件名

-o 要么

-name '*~' 查找以波浪号结尾的文件名(通常是文本编辑程序的备份文件)

但是,此答案和所有其他答案都丢失了当前目录.hidden文件中的文件。如果您正在编写脚本,那么这些行将读取.hidden文件并显示现有文件的文件名。

if [[ -f .hidden]] # if '.hidden' exists and is a file
then
    while read filename # read file name from line
    do
        if [[ -e "$filename" ]] # if the read file name exists
        then
            echo "$filename" # print it
        fi
    done < .hidden # read from .hidden file
fi

什么.hidden文件 为什么会有一个名为.hidden的文件包含文件名?无论如何,如果有一个人,当您只需要什么时,为什么还要做那么复杂的事情cat .hidden呢?您的find命令正确(ish),但-name '*~'无关紧要。以波浪号结尾的文件是备份文件,但不以任何方式隐藏。
terdon

@terdon该.hidden文件用于当您无法将文件/文件夹名称更改为以点开头时要隐藏的文件和文件夹。至于以波浪号结尾的文件,取决于系统。ls -B就像大多数GUI文件浏览器一样,将忽略此类文件。
Mark H

cat .hidden如果自添加到.hidden文件后删除或移动了这些文件,则可能会显示不存在的文件。
Mark H

这很好。
Penghe Geng

2

我认为您可以使用以下命令来执行此操作。

ls -a | grep "^\." | grep -v "^\.$" | grep -v "^\..$"

ls -a 您输入的命令将显示当前工作目录中的所有文件和目录。

grep "^\."我附加的命令,它过滤输出以仅显示隐藏文件(名称以开头".")。

grep -v "^\.$" | grep -v "^\..$" 我附加的命令,用于过滤输出以排除。,..(它们是当前目录和父目录)。

如果某些文件名可以包含多于一行"\n",则上面的示例可能是错误的。

因此,我建议使用以下命令来解决该问题。

find -maxdepth 1 -name ".[!.]*"


@RaduRădeanu我看到了您的评论,太好了。我再次编辑了答案。谢谢您的评论。
xiaodongjie

2

您还可以做些什么,is ls .?*否则ls .!(|)将向您显示当前目录中顶部隐藏的文件/目录以及下面其他文件/目录中的所有内容

例如:从我的终端

$ ls .?*       
.bash_history    .dmrc        .macromedia   .weather
.bash_logout     .gksu.lock   .profile      .wgetrc
.bash_profile    .bashrc.save .ICEauthority .toprc           .Xauthority
.bashrc          .lastdir     .viminfo      .xsession-errors
.bashrc~         .dircolors   .lynxrc       .vimrc           .xsession-errors.old

..:
Baron

.adobe:
Flash_Player

.aptitude:
cache  config

.cache:
compizconfig-1                              rhythmbox
dconf                                       shotwell

现在注意上面的结果,它显示了每个文件/目录及其子目录以及下面的任何隐藏文件。

[1:0:248][ebaron@37signals:pts/4][~/Desktop]
$ ls .!(|)
.bash_aliases  .bashrc1  .bashrc1~

..:
askapache-bash-profile.txt  examples.desktop             Public           top-1m.csv
backups             Firefox_wallpaper.png        PycharmProjects          top-1m.csv.zip
Desktop             java_error_in_PYCHARM_17581.log  Shotwell Import Log.txt  topsites.txt
Documents           Music                Templates            Videos
Downloads           Pictures                 texput.log           vmware

对不起,我不能发表评论。在这里解释之间的区别ls .?*和@ cioby23答案ls -d .[!.]* .??*,为什么它是实际打印隐藏文件两次是因为从字面上你问两次.??*.?*.[!.]*他们是同样的事情,所以添加任何他们具有不同的命令字符,将打印的两倍。


1

您还可以使用:

ls -d .[!.]* .??*

这将允许您显示普通的隐藏文件和以2或3点开头的隐藏文件,例如: ..hidden_file


1
有了这个我所有隐藏文件两次。
TuKsn 2014年

1

你可以使用命令

ls -Ad .??*

ls -a | grep "^\."解决方案中基于grep的方法不同,这具有允许多列列出的优点


1

到目前为止,所有答案都基于以下事实:名称以点开头的文件(或目录)被“隐藏”。我想出了另一种解决方案,该解决方案可能效率不高,但是该解决方案不假设任何有关隐藏文件名称的信息,因此避免..在结果中列出(与当前接受的答案一样)。

完整的命令是:

ls -d $(echo -e "$(\ls)\n$(\ls -A)" | sort | uniq -u)

说明

这是两次列出所有文件(和目录),

echo -e "$(\ls)\n$(\ls -A)"

但只显示一次隐藏文件-A

然后,对列表进行排序| sort,使常规(未隐藏)文件出现两次并彼此相邻。

然后,删除所有出现多次的行| uniq -u,仅保留唯一的行。

最后,ls再次使用列出所有带有用户自定义选项的文件,而不列出列表中目录的内容-d

编辑(限制):

正如muru指出的那样,如果存在带有诸如这样的名称的文件,则该解决方案将无法正常工作,escaped\ncharacter.txt因为echo -e它将文件名分成两行。如果有两个隐藏文件的名称几乎相同,除了一个特殊字符(例如.foo[tab].txt和).foo[new-line].txt,则它也不会按预期方式工作,因为这两个文件都将被打印,.foo?.txt并会被删除。uniq -u


1
我认为这几乎就是隐藏文件的定义。甚至这些隐藏文件的来源也来自.作为第一个字符处理时的错误。
muru 18/09 / 26,2

我在第一段中提到了这一点。但是,它得到的结果仍然不同于当前接受的答案
alejandro

当然,它不包括..,但我想知道它与包含特殊字符的文件名的配合效果如何。
muru

我不完全知道特殊字符的含义,但是我认为这不会造成问题,因为此解决方案不假设文件名有关任何问题
alejandro

实际上,您确实要假设至少一件事:文件名中没有换行符。另外:文件名中没有echo -e可解释的转义序列。另外:ls不会破坏文件名,以使两个不同的文件名显示相同(例如,在某些版本ls中将使用?特殊字符,因此.foo\tbar\t=> tab)和.foo\nbar\n= = newline)都将显示为foo?bar)。
muru 18/09 / 26,2

1

另外,您也可以使用 echo .*

例如

user@linux:~$ echo .*
. .. .bash_aliases .bash_history .bash_logout .bashrc
user@linux:~$

如果您喜欢长列表格式,只需将空格转换为新行即可。

user@linux:~$ echo .* | tr ' ' '\n'
.
..
.bash_aliases
.bash_history
.bash_logout
.bashrc
user@linux:~$ 

0

使用bash,设置GLOBIGNORE特殊的变量是一些非空值是足以令它忽略...扩大水珠时。从Bash文档

所述GLOBIGNORE外壳变量可以用来限制该组匹配的图案的文件名。如果GLOBIGNORE设置为,则与匹配模式之一匹配的每个匹配文件GLOBIGNORE名将从匹配列表中删除。如果nocaseglob设置了该选项,GLOBIGNORE则不考虑大小写而执行与输入模式的匹配。设置时,文件名...始终被忽略 GLOBIGNORE,不为null。但是,设置GLOBIGNORE为非null值会启用dotglob shell选项,因此所有其他以‘.' 开头的文件名都将匹配。

如果将其设置为.:..,则...都将被忽略。由于将其设置为任何非空也将获得此行为,因此我们不妨将其设置为.

所以:

GLOBIGNORE=.
ls -d .*
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.