该命令列出当前路径下的目录:

ls -d */

模式*/到底做什么?

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


当前回答

file * | grep directory

输出(在我的机器上)——

[root@rhel6 ~]# file * | grep directory
mongo-example-master:    directory
nostarch:                directory
scriptzz:                directory
splunk:                  directory
testdir:                 directory

以上输出可以通过使用cut进行进一步细化:

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

其他回答

如果你有空间在你的文件夹名称$9打印不工作尝试下面的命令

ls -l yourfolder/alldata/ | grep '^d' | awk '{print $9" " $10}'

输出

ls -l yourfolder/alldata/ | grep '^d' | awk '{print $9" " $10}'
testing_Data 
Folder 1

显示没有/的文件夹列表:

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

我用以下方法部分解决了这个问题:

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

好吧,这对我来说是主要的部分:)

使用Test -d测试项目是否为目录:

for i in $(ls); do test -d $i && echo $i ; done

四种(更多)可靠的选择。

不加引号的星号*将被shell解释为模式(glob)。shell将在路径名展开中使用它。然后它将生成一个与模式匹配的文件名列表。

一个简单的星号将匹配PWD(当前工作目录)中的所有文件名。更复杂的*/模式将匹配所有以/结尾的文件名。因此,所有目录。这就是为什么命令:

1.——回声。

echo */
echo ./*/              ### Avoid misinterpreting filenames like "-e dir"

将被扩展(由shell)以回显PWD中的所有目录。


要测试这一点:创建一个名为test-dir的目录(mkdir),并将cd放入其中:

mkdir test-dir; cd test-dir

创建一些目录:

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 ./*/将保持可靠,即使有奇数个命名文件:

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

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


如果我们用ls代替echo。shell仍然是扩展文件名列表的对象。shell是获取PWD中的目录列表的原因。ls的-d选项使其列出当前目录条目,而不是每个目录的内容(默认情况下是这样)。

ls -d */

然而,这个命令(有点)不太可靠。对于上面列出的奇数命名文件,它将失败。它会因为几个名字而窒息。你需要一个一个地删除,直到找到有问题的。

2.-ls

GNU ls将接受“结束选项”(——)键。

ls -d ./*/                     ### More reliable BSD ls
ls -d -- */                    ### More reliable GNU ls

3. printf

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

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

而且,更好的是,我们可以删除尾随的/:

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

这样的尝试

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

会失败:

一些名称(ls -d */)如上所示。 会受到IFS值的影响。 将在空格和选项卡上拆分名称(使用默认的IFS)。 名称中的每个换行符将开始一个新的echo命令。

4.——函数

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

$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs

列出以下清单:

--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var

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