关于目录:在bash中ls只列出目录

Listing only directories using ls in bash: An examination

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

模式*/具体做什么?

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


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


实现这一点的四种方法,每种方法都有不同的输出格式1。使用echo

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

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

2。仅使用ls

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

1
2
cs/     files/      masters/  
draft/  hacks/      static/

或列表形式(含详细信息):ls -dl */

三。使用lsgrep

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

1
2
3
4
5
6
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
这是我得到的:

1
2
3
4
5
6
cs  
draft  
files  
hacks  
masters  
static

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

1
2
3
4
5
6
cs/  
draft/  
files/  
hacks/  
masters/  
static/


我使用:

1
ls -d */ | cut -f1 -d'/'

这将创建一个没有尾随斜杠的单列-在脚本中很有用。

我的两分钱。


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

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

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

1
find /home/alice/Documents -type d


4(更多)个可靠选项。

未加引号的星号*将被shell解释为模式(glob)。shell将在路径名扩展中使用它。然后它将生成与模式匹配的文件名列表。简单的星号将匹配pwd(当前工作目录)中的所有文件名。更复杂的模式如*/将匹配以/结尾的所有文件名。因此,所有目录。这就是为什么命令:

1。-回声。

1
2
echo */
echo ./*/              ### avoid misinterpreting filenames like"-e dir"

将(由shell)扩展到echopwd中的所有目录。

要测试这个:创建一个名为test dir的目录(mkdircd到其中:

1
mkdir test-dir; cd test-dir

创建一些目录:

1
2
3
mkdir {cs,files,masters,draft,static}   # safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces}  # some a bit less secure.
touch -- 'file with spaces' '-a' '-l' 'filename'    # and some files:

即使使用奇数命名文件,命令echo ./*/仍然可靠:

1
2
./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/

但是文件名中的空格会让阅读有点混乱。

如果我们使用ls而不是echo,那么shell仍然是扩展文件名列表的工具。shell是获取pwd中目录列表的原因。ls-d选项使其列出当前目录条目,而不是每个目录的内容(默认情况下显示)。

1
ls -d */

然而,这个命令(稍微)不太可靠。它将失败,上面列出的奇数命名文件。它会被几个名字堵住。你需要一个接一个地删除,直到找到有问题的。

2、LS

GNU ls将接受"选项结束"(--键)。

1
2
ls -d ./*/                     ### more reliable BSD ls
ls -d -- */                    ### more reliable GNU ls

3、打印

要在自己的行中列出每个目录(在一列中,类似于ls-1),请使用:

1
2
$ printf"%s
"
*/        ### Correct even with"-", spaces or newlines.

更好的是,我们可以去掉后面的/

1
2
$ set -- */; printf"%s
"
"${@%/}"        ### Correct with spaces and newlines.

这样的尝试:

1
$ for i in $(ls -d */); do echo ${i%%/}; done

将失败:

  • 上面已经显示了一些名称(ls -d */)。
  • 会受到IFS值的影响。
  • 将在空格和制表符上拆分名称(默认为IFS)。
  • 名称中的每个换行符都将启动一个新的echo命令。

4、-函数

最后,在函数内使用参数列表不会影响当前正在运行的shell的参数列表。简单地说:

1
2
3
$ listdirs(){ set -- */; printf"%s
"
"${@%/}"; }
$ listdirs

显示此列表:

1
2
3
4
5
6
7
8
9
10
11
12
--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var

此选项对于几种类型的奇数文件名是安全的。


tree命令在这里也非常有用。默认情况下,它将完全显示所有文件和目录,其中一些ASCII字符显示目录树。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ tree
.
├── config.dat
├── data
│   ├── data1.bin
│   ├── data2.inf
│   └── sql
|   │   └── data3.sql
├── images
│   ├── background.jpg
│   ├── icon.gif
│   └── logo.jpg
├── program.exe
└── readme.txt

但是,如果我们只想获取目录,而不需要使用ASCII树,以及当前目录的完整路径,那么可以这样做:

1
2
3
4
5
$ tree -dfi
.
./data
./data/sql
./images

参数如下:

1
2
3
-d     List directories only.
-f     Prints the full path prefix for each file.
-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

如果需要绝对路径,可以从指定当前目录的完整路径开始:

1
2
3
4
5
$ tree -dfi"$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images

为了限制子目录的数量,可以使用-L level设置子目录的最大级别,例如:

1
2
3
4
$ tree -dfi -L 1"$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images

用人树可以看到更多的论据。


如果您想知道"ls-d*/"的输出为什么会给您两个尾随斜杠,例如:

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

这可能是因为shell或会话配置文件的某个地方将ls命令别名为包含-f标志的ls版本。该标志在每个输出名(不是普通文件)后面附加一个字符,指示它是什么类型的文件。因此,一个斜杠是来自匹配模式"*/"的斜杠,另一个斜杠是附加的类型指示符。

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

LS-D*/


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

1
alias lsd='ls -ld */'

然后LSD将产生所需的结果。


如果不需要列出隐藏目录,我提供:

1
ls -l | grep"^d" | awk -F"" '{print $9}'

如果需要列出隐藏目录,请使用:

1
ls -Al | grep"^d" | awk -F"" '{print $9}'

1
find -maxdepth 1 -type d | awk -F"./" '{print $2}'


显示不带/的文件夹列表

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


(P)For listing only Directories:(p)字母名称(P)For listing only files:(p)字母名称(P)or also you can do as:S-LD*/.(p)


这是我用的

ls -d1 /Directory/Path/*;


目前的EDOCX1 0(P)Many answers here don't actually use EDOCX1 welching(or only use it in the triinal sense of EDOCX1 penal 2,while using wildcards for the actual substantory matching).A true EDOCX1 plus 0 original solution is useful,since it allows the use of EDOCX1 simplication 0 options for sorting order,etc.(p)Excluding Symlinks(P)1.One solution using EDOCX1 pental 0 has been given,but it does some different from the other solutions in that it excludes symlinks to directions:(p)字母名称(P)(Possibly piping through EDOCX1 theocx1)(p)包括Symlinks(P)In the(probably more common)case that symlinks to directories should be included,we can use the EDOCX1 pental 8 option of EDOCX1(p)字母名称(P)Or,get rid of the trailing slashes:(p)字母名称(P)We can add options to EDOCX1 indicative 0 as needed(if a long listing is used,the EDOCX1 indicative 11 is no longer required).(p)(P)Note:If we want trailing slashes,but don't want them highlighted by EDOCX1 original 12,we can hackishly remove the highlighting by making the actual matched portion of the line empty:(p)字母名称


(P)测试项目是否是一个带有EDOCX1的目录(p)字母名称


(P)Using Perl:(p)字母名称


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

要只列出目录,我喜欢这个函数:

1
2
3
4
# long list only directories
llod () {
  ls -l --color=always"$@" | grep --color=never '^d'
}

把它放在你的.bashrc里。

使用实例:

1
2
3
4
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选项,它将中断。这里有一个解决方法:

1
2
3
4
# long list only directories
llod () {
  ls -l --color=always"$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}

仅供参考,如果您希望以多行方式打印所有文件,您可以执行一个ls -1,它将在单独的行中打印每个文件。文件1文件2文件3


一个只从"这里"列出目录的行程序。

文件计数。

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

(P)试试这个。This will work on all distrosLS-LTR§124;GREP DRW(p)


(P)a Plain list of the current directory,it'd be:(p)字母名称(P)Do you want it sorted and clean?(p)字母名称布尔奇1


我部分解决了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

好吧,这对我来说,市长部分:)


(P)To answer the original question,EDOCX1 universal 14 has nothing to do with EDOCX1 gendiographic 0 communal per know;it is done by the Shell/Bash,in a process known as globding.(p)(P)This is why EDOCX1 penography 16 welcx1 and EDOCX1 penography 17 welcx1 output the same elements.(The EDOCX1 18 silencia flag makes EDOCX1 university 0 auspit the directory names and not contents of the directions.)(p)


另外,为了使它成为一个完整的循环,为了检索每个文件夹的路径,使用阿尔伯特的答案和戈尔丹的组合,这应该是非常有用的。

1
for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done

输出:

1
2
3
4
5
6
7
8
/pathto/parent/folder/childfolder1/
/pathto/parent/folder/childfolder2/
/pathto/parent/folder/childfolder3/
/pathto/parent/folder/childfolder4/
/pathto/parent/folder/childfolder5/
/pathto/parent/folder/childfolder6/
/pathto/parent/folder/childfolder7/
/pathto/parent/folder/childfolder8/

字母名称(P)这就是我的男人。(p)字母名称(P)Above output can be refined more by using cut.(p)字母名称


(P)这里是我唯一使用的名称:(p)字母名称