bash - ls只列出目录




在bash中仅列出使用ls的目录:检查 (14)

实际的ls解决方案,包括到目录的符号链接

这里的许多答案实际上并不使用ls (或者仅仅在ls -d意义上使用ls -d ,而使用通配符来实现实际的子目录匹配。真正的ls解决方案很有用,因为它允许使用ls选项来进行排序等等

排除符号链接

已经给出了一种使用ls解决方案,但它与其他解决方案有所不同,因为它排除了对目录的符号链接

ls -l | grep '^d'

(可能通过sedawk来隔离文件名)

包括符号链接

在应该包含符号链接的(可能更常见的)情况下,我们可以使用ls-p选项:

ls -1p | grep '/$'

或者,摆脱尾随的斜杠:

ls -1p | grep '/$' | sed 's/\/$//'

我们可以根据需要向ls添加选项(如果使用长列表,则不再需要-1 )。

注意:如果我们想要结尾斜杠,但不希望它们通过grep突出显示,我们可以通过将该行的实际匹配部分设为空来删除突出显示:

ls -1p | grep -P '(?=/$)'

该命令列出当前路径中的目录: ls -d */

模式*/究竟做了什么?

我们如何才能在上面的命令中给出绝对路径(例如ls -d /home/alice/Documents )以仅列出该路径中的目录?


四种方法来完成这项工作,每种方法都有不同的输出格式

1.使用echo

例如: echo */echo */*/
这是我得到的:

cs/ draft/ files/ hacks/ masters/ static/  
cs/code/ files/images/ static/images/ static/stylesheets/  

2.仅使用ls

例如: ls -d */
这正是我得到的:

cs/     files/      masters/  
draft/  hacks/      static/  

或作为列表(具有详细信息): ls -dl */

3.使用lsgrep

例如: ls -l | grep "^d" ls -l | grep "^d"这是我得到的:

drwxr-xr-x  24 h  staff     816 Jun  8 10:55 cs  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 draft  
drwxr-xr-x   9 h  staff     306 Jun  8 10:55 files  
drwxr-xr-x   2 h  staff      68 Jun  9 13:19 hacks  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 masters  
drwxr-xr-x   4 h  staff     136 Jun  8 10:55 static  

4. Bash脚本(不建议用于文件名包含空格。)

例如: for i in $(ls -d */); do echo ${i%%/}; done for i in $(ls -d */); do echo ${i%%/}; done
这是我得到的:

cs  
draft  
files  
hacks  
masters  
static

如果你喜欢用'/'作为结尾字符,命令将是: for i in $(ls -d */); do echo ${i}; done for i in $(ls -d */); do echo ${i}; done

cs/  
draft/  
files/  
hacks/  
masters/  
static/

*/是一个匹配当前目录中所有子目录的模式( *会匹配所有文件子目录; /限制它到目录)。 同样,要列出/ home / alice / Documents下的所有子目录,请使用ls -d /home/alice/Documents/*/


*/是与当前目录中的目录匹配的文件名匹配模式。

要仅列出目录,我喜欢这个功能:

# long list only directories
llod () { 
  ls -l --color=always "[email protected]" | grep --color=never '^d'
}

把它放在你的.bashrc中。

用法示例:

llod       # long listing of all directories in current directory
llod -tr   # same but in chronological order oldest first
llod -d a* # limit to directories beginning with letter 'a'
llod -d .* # limit to hidden directories

注意:如果您使用-i选项,它会中断。 这是一个解决方案:

# long list only directories
llod () { 
  ls -l --color=always "[email protected]" | egrep --color=never '^d|^[[:digit:]]+ d'
}

仅供参考,如果您想以多行方式打印所有文件,您可以执行ls -1 ,这将在单独的行中打印每个文件。 file1 file2 file3


使用Perl:

ls | perl -nle 'print if -d;'

单线只列出来自“这里”的目录。

随着文件计数。

for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done

如果你想知道为什么'ls -d * /'的输出会给你两个尾部的斜线,比如:

[prompt]$ ls -d */    
app//  cgi-bin//  lib//        pub//

这可能是因为你的shell或会话配置文件的某处将ls命令别名为包含-F标志的ls版本。 该标志将一个字符附加到每个输出名称(这不是一个普通文件),指出它是什么类型的东西。 因此,一个斜线是匹配模式'* /'的斜线,另一个斜线是附加类型指标。

为了摆脱这个问题,你当然可以为ls定义一个不同的别名。 但是,要暂时不调用别名,可以在反斜杠前加上命令:

\ ls -d * /


对于没有子文件夹的所有文件夹:

find /home/alice/Documents -maxdepth 1 -type d

对于包含子文件夹的所有文件夹:

find /home/alice/Documents -type d

我只是把它添加到我的.bashrc文件中(如果你只需要/需要一个会话,你也可以在命令行中输入)

alias lsd='ls -ld */'

那么lsd将产生所需的结果。


我部分解决了:

cd "/path/to/pricipal/folder"

for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done

ln: «/home/inukaze/./.»: can't overwrite a directory
ln: «/home/inukaze/../..»: can't overwrite a directory
ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels

那么,这减少了我,市长部分:)


显示没有/

ls -d */|sed 's|[/]||g'

这是我正在使用的

ls -d1 /Directory/Path/*;


file *|grep directory

O / P(在我的机器上) -

[[email protected] ~]# file *|grep directory
mongo-example-master:    directory
nostarch:                directory
scriptzz:                directory
splunk:                  directory
testdir:                 directory

以上输出可以通过使用剪切进一步细化。

file *|grep directory|cut -d':' -f1
mongo-example-master
nostarch
scriptzz
splunk
testdir

* could be replaced with any path that's permitted
 file - determine file type
 grep - searches for string named directory
 -d - to specify a field delimiter
 -f1 - denotes field 1




ls