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

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

我应该使用什么命令?

评论

一个简单的ls -ld。*或ls -ald。*将起作用

#1 楼

命令:

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 


评论


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

–psusi
2014年5月19日0:50

@psusi,我认为目的是要排除。和..从比赛开始。但是,它也将排除(完全合法)单字符隐藏文件名,例如.a,.1等。也许更好的扩展glob将是。!(|。),即文字点后跟除无或其他(单个)点以外的任何内容,即ls -d。!(|。)

–钢驾驶员
2014年5月19日在1:25



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

–psusi
2014年5月19日下午3:37

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

–RCF
14年5月19日在21:30



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

–杨辉
18年1月26日在5:33



#2 楼

ls -d .!(|.)


正是OP在寻找什么。

评论


这是如何运作的?

–SarcasticSully
18年6月7日在17:56

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

–帕特里克
18年6月12日在15:22

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

–卡洛斯·门多萨(Carlos Mendoza)
18-09-18在13:35

@CarlosMendoza会变成空模式,所以就像。后面不跟(什么也不是。),不包括。本身和...

–muru
18-09-26在2:27

#3 楼

如果只希望当前目录中的文件(不递归),则可以执行

echo .[^.]*


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

还可以使用find

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


-mindepth确保我们不匹配.,而-prune意味着find不会下降进入子目录。

#4 楼

ls -ad .*


在Bash中为我工作。

评论


显示。和..在Bash中

–耿鹏和
18年8月29日在14:09

#5 楼

使用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
2014年5月19日下午3:08

#6 楼

对于复杂的搜索,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的文件包含文件名?无论如何,如果有一个原因,当您只需要隐藏所有内容时,为什么还要做那么复杂的事情?您的find命令正确(ish),但-name'*〜'不相关。以波浪号结尾的文件是备份文件,但不以任何方式隐藏。

– terdon
2014年5月21日,3:19

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

– Mark H
16年5月2日在21:31



如果将cat.hidden文件添加到.hidden文件后将其删除或移动,则cat .hidden文件可能会显示不存在的文件。

– Mark H
16年5月2日在21:35

这很好。

–耿鹏和
18年8月29日在14:10

#7 楼

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

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


ls -a命令,该命令显示当前工作目录中的所有文件和目录。

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

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

如果某些文件名可以用"\n"超过一行,则上面的示例可能是错误的。

,所以我建议使用以下命令来解决该问题。
/>
find -maxdepth 1 -name ".[!.]*"


评论


您永远不要解析ls的输出。

– RaduRădeanu
2014年5月19日晚上8:50

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

–小东街
2014年5月21日,3:03

#8 楼

您还可以做些什么,is ls .?*ls .!(|),它们将在顶部显示当前目录隐藏文件/目录以及在下面其他文件/目录中的所有内容。 br />
$ 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 .[!.]* .??*为什么实际上两次打印隐藏文件是因为从字面上您问两次.??*.?*.[!.]*他们是同一回事,所以将其中任何一个添加有不同的命令字符将打印两次。

#9 楼

您还可以使用:

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


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

评论


有了这个我所有隐藏文件两次。

– TuKsn
2014年5月19日在9:02

#10 楼

您可以使用命令

ls -Ad .??*


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

#11 楼

使用bash时,将GLOBIGNORE特殊变量设置为一些非空值就足以使其在扩展glob时忽略...。从Bash文档:


GLOBIGNORE shell变量可用于限制与模式匹配的文件名的集合。如果设置了GLOBIGNORE,则从匹配列表中删除也匹配GLOBIGNORE中的一种模式的每个匹配的
文件名。如果设置了nocaseglob选项,则
将与GLOBIGNORE中的模式进行匹配,而无需考虑大小写。当
.被设置且不为null时,文件名..GLOBIGNORE始终被忽略。但是,将GLOBIGNORE设置为
非空值会启用dotglob shell选项,因此
‘.'开头的所有其他文件名都将匹配。


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

所以:

GLOBIGNORE=.
ls -d .*


#12 楼

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

完整的命令是:

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


说明

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

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


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

然后该列表被排序| sort,这使常规(未隐藏)文件出现两次,并在旁边

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

最后再次使用| uniq -u列出具有用户自定义选项的所有文件并且未在列表ls中列出目录的内容。

编辑(限制):

正如muru指出的那样,如果存在带有以下内容的文件,则该解决方案将无法正常工作su之所以将其命名为-d,是因为escaped\ncharacter.txt会将文件名分为两行。如果存在两个具有几乎相同名称的隐藏文件(除了特殊字符)(例如echo -e.foo[tab].txt),它们也将无法正常工作,因为这两个文件都被打印为.foo[new-line].txt,并会被.foo?.txt消除

评论


我认为这几乎就是隐藏文件的定义。这些隐藏文件的来源甚至都来自处理中的一个错误。作为第一个字符。

–muru
18-09-26在2:05

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

– alejandro
18-09-26在2:13

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

–muru
18-09-26在2:15

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

– alejandro
18/09/26'2:21

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

–muru
18-09-26在2:25



#13 楼

另外,也可以使用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:~$ 


#14 楼

方法1:ls -d .{[!.],.?}*

说明:我要排除...,但要包含..i_am_also_a_hidden_file.txt之类的文件



ls -d .*不希望地显示...


ls -d .?*(当前接受的答案)不希望地显示..


ls -d .[!.]*并不需要地显示..i_am_also_a_hidden_file.txt



ls -d .{[!.],.?}*是答案

方法2:ls -A | grep "\."

我个人更喜欢这种方式

#15 楼

列出所有隐藏文件和文件夹:

ls -ld .*


仅列出隐藏文件:

ls -ld .*|grep -v ^d


列出仅隐藏的文件夹:

ls -ld .*|grep ^d


#16 楼

您还可以使用进程替换
 diff <(ls -1A) <(ls -1)

解释:
将命令的stdout插入另一个命令的stdin是一项强大的技术。但是,如果您需要传递多个命令的标准输出怎么办?这就是进程替换的来源。
进程替换将一个或多个进程的输出馈送到另一个进程的stdin中。
这里引用了
,因此您将两个输出通过管道传递到diff命令。
第一个命令是“ ls -1A”。 “ -A”标志的工作方式类似于“ -a”标志,但不会显示“。”。和“ ..”。因此,它基本上向您显示目录中的所有文件和目录(隐藏和未隐藏)。 “ -1”标志将“ ls”的输出一个垂直显示在另一个下方,而不显示在水平列表中。

#17 楼

我不喜欢-d,因为如果没有匹配项,它只会显示no matches found
也不会在行首显示total [size]
我认为ls -lA --ignore "[^\.]*"是更好的解决方案。

#18 楼

我通常在文件和目录中使用简称:
ls -A .

如果要添加文件属性,例如:
ls -lA .


#19 楼

您可以使用命令
ls -pa | grep -v /

标志说明:


-p将“ /”指示符附加到目录

-a将列出隐藏文件

grep -v /命令将返回不包含斜杠的行。