Listing only directories using ls in bash: An examination
此命令列出当前路径中的目录:
模式
我们如何在上面的命令中给出绝对路径(例如
实现这一点的四种方法,每种方法都有不同的输出格式1。使用
示例:
这是我得到的:
1 2 | cs/ draft/ files/ hacks/ masters/ static/ cs/code/ files/images/ static/images/ static/stylesheets/ |
2。仅使用
示例:
这正是我得到的:
1 2 | cs/ files/ masters/ draft/ hacks/ static/ |
或列表形式(含详细信息):
示例:
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脚本(不建议用于包含空格的文件名)
示例:
这是我得到的:
1 2 3 4 5 6 | cs draft files hacks masters static |
如果您想使用'/'作为结束字符,命令将是:
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(更多)个可靠选项。
未加引号的星号
1 2 | echo */ echo ./*/ ### avoid misinterpreting filenames like"-e dir" |
将(由shell)扩展到
要测试这个:创建一个名为test dir的目录(
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: |
即使使用奇数命名文件,命令
1 2 | ./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/ ./masters/ ./-n/ ./static/ ./-v var/ |
但是文件名中的空格会让阅读有点混乱。
如果我们使用
1 | ls -d */ |
然而,这个命令(稍微)不太可靠。它将失败,上面列出的奇数命名文件。它会被几个名字堵住。你需要一个接一个地删除,直到找到有问题的。
2、LSGNU
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 |
此选项对于几种类型的奇数文件名是安全的。
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 |
为了限制子目录的数量,可以使用
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*/
我只是将它添加到我的
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)
这是我用的
目前的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 |
注:如果您使用
1 2 3 4 | # long list only directories llod () { ls -l --color=always"$@" | egrep --color=never '^d|^[[:digit:]]+ d' } |
仅供参考,如果您希望以多行方式打印所有文件,您可以执行一个
一个只从"这里"列出目录的行程序。
文件计数。
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)字母名称