命令
ls -a
列出所有文件,包括隐藏的文件,但我只需要列出隐藏的文件。我应该使用什么命令?
#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 楼
使用find
和awk
,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 /
命令将返回不包含斜杠的行。
评论
一个简单的ls -ld。*或ls -ald。*将起作用