Answers:
*/
是与当前目录中所有子目录匹配的模式(*
将与所有文件和子目录匹配;将其/
限制为目录)。同样,要列出/ home / alice / Documents下的所有子目录,请使用ls -d /home/alice/Documents/*/
ls
不存在的东西,都会收到该错误。
ls */
将扩展为just ls
,它将列出当前目录中的所有文件。我很确定那不是您想要的那种情况。
echo
示例:echo */
,echo */*/
这是我得到的:
cs/ draft/ files/ hacks/ masters/ static/
cs/code/ files/images/ static/images/ static/stylesheets/
ls
仅使用示例:ls -d */
这正是我得到的:
cs/ files/ masters/
draft/ hacks/ static/
或作为列表(包含详细信息): ls -dl */
ls
和grep
示例: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
示例:for i in $(ls -d */); do echo ${i%%/}; done
这是我得到的:
cs
draft
files
hacks
masters
static
如果您希望将“ /”作为结束字符,则命令将为: for i in $(ls -d */); do echo ${i}; done
cs/
draft/
files/
hacks/
masters/
static/
3
对我来说明显比其他人慢。在我测试的目录中:1
.012s,2
.016s,3
.055s和4
.021s。
1
是我的最爱。
time
了Unix函数。///我同意,echo */
比聪明ls -d */
。
1.
在处理带有空格的文件夹名称时,该选项将引起很多麻烦。
我用:
ls -d */ | cut -f1 -d'/'
这将创建不带斜杠的单列-在脚本中很有用。
我的两分钱。
-1
选项ls
也将以单列格式输出ls -1 -d */
。
-1
对于每个条目,仍然输出尾部斜杠。
.bashrc
为别名时,如何添加'/'
?
'\/'
| sed -e 's-/$--'
对于所有不包含子文件夹的文件夹:
find /home/alice/Documents -maxdepth 1 -type d
对于所有带有子文件夹的文件夹:
find /home/alice/Documents -type d
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
否则,您将/home/alice/Documents
自身包括在内。要包括指向目录的符号链接,请在-L
一个不带引号的星号*
将被解释为通过所述壳的图案(水珠)。
外壳程序将在路径名扩展中使用它。
然后,它将生成与模式匹配的文件名列表。
一个简单的星号将匹配PWD(当前工作目录)中的所有文件名。
更复杂的模式,*/
将匹配以结尾的所有文件名/
。
因此,所有目录。这就是为什么命令:
echo */
echo ./*/ ### avoid misinterpreting filenames like "-e dir"
将被外壳扩展到echo
PWD中的所有目录。
要对此进行测试,请执行以下操作:创建一个mkdir
名为test-dir 的目录(),并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/
但是文件名中的空格使读取有些混乱。
如果相反的echo
,我们使用ls
,外壳依然什么是扩大文件名列表。Shell是获取PWD中目录列表的原因。使它的-d
选项ls
列出当前目录条目,而不是每个目录的内容(默认情况下显示)。
ls -d */
但是,此命令(某种程度上)不太可靠。上面列出的奇数命名文件将失败。它会用几个名字cho住。您需要一个一个地擦除,直到找到有问题的。
GNU ls
将接受“选项结束”(--
)键。
ls -d ./*/ ### more reliable BSD ls
ls -d -- */ ### more reliable GNU ls
要在自己的行中列出每个目录(在同一列中,类似于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
)。最后,在函数内部使用参数列表不会影响当前正在运行的Shell的参数列表。只是:
$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs
显示此列表:
--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var
此选项对于几种类型的奇数文件名是安全的。
该tree
命令在这里也非常有用。默认情况下,它将显示所有文件和目录的完整深度,并带有一些ascii字符显示目录树。
$ tree
.
├── config.dat
├── data
│ ├── data1.bin
│ ├── data2.inf
│ └── sql
| │ └── data3.sql
├── images
│ ├── background.jpg
│ ├── icon.gif
│ └── logo.jpg
├── program.exe
└── readme.txt
但是,如果我们只想获取目录,而不使用ascii树,并使用当前目录的完整路径,则可以执行以下操作:
$ tree -dfi
.
./data
./data/sql
./images
参数为:
-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.
然后,如果您需要绝对路径,则可以从指定当前目录的完整路径开始:
$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images
为了限制子目录的数量,可以使用设置子目录的最大级别-L level
,例如:
$ tree -dfi -L 1 "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images
男人树可以看到更多的论点
我只是将其添加到我的.bashrc
文件中(如果只需要/想要一个会话,也可以在命令行中键入它)
alias lsd='ls -ld */'
然后lsd将产生所需的结果。
ls
解决方案,包括目录的符号链接这里的许多答案实际上并没有使用ls
(或仅在琐碎的意义上ls -d
使用,而将通配符用于实际的子目录匹配。真正的ls
解决方案很有用,因为它允许使用ls
选项进行排序等)。
给出了一种使用的解决方案ls
,但它与其他解决方案有所不同,因为它排除了指向目录的符号链接:
ls -l | grep '^d'
(可能通过管道传递sed
或awk
隔离文件名)
在(可能更常见的)情况下,应包括指向目录的符号链接,我们可以使用的-p
选项ls
,这使它在目录名称(包括符号链接的目录)的名称后添加斜杠字符:
ls -1p | grep '/$'
或者,摆脱尾随的斜杠:
ls -1p | grep '/$' | sed 's/\/$//'
我们可以ls
根据需要向中添加选项(如果使用了较长的列表,-1
则不再需要)。
注意:如果我们要使用斜杠,但不希望使用突出显示斜线,则grep
可以通过将行的实际匹配部分留空来暗中删除突出显示:
ls -1p | grep -P '(?=/$)'
这是我正在使用的
ls -d1 /Directory/Path/*;
ls -d1 /Directory/Path/*/
仅列出目录:
ls -l | grep ^d
仅列出文件:
ls -l | grep -v ^d
或者您也可以这样做:ls -ld * /
*/
是与当前目录中的目录匹配的文件名匹配模式。
仅列出目录,我喜欢此功能:
# long list only directories
llod () {
ls -l --color=always "$@" | 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 "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}
仅供参考,如果您要多行打印所有文件,可以执行一个操作ls -1
,该命令将在单独的行中打印每个文件。file1 file2 file3
我部分解决了:
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
好吧,这减少了我,市长的一部分:)
再加上使它变成一个完整的圆圈,以检索每个文件夹的路径,请使用Albert的答案以及应该非常有用的Gordans的组合。
for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done
输出:
/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/
使用Perl:
ls | perl -nle 'print if -d;'
这是使用树的一种变体,它仅在单独的行上输出目录名称,是的,它很丑,但是,它可以工作。
tree -d | grep -E '^[├|└]' | cut -d ' ' -f2
或用awk
tree -d | grep -E '^[├|└]' | awk '{print $2}'
但是,这可能会更好,并将保留/
之后的目录名称。
ls -l | grep "^d" | awk '{print $9}'
file *|grep directory
O / P(在我的机器上)-
[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
有史以来最短的命令(实际上是hack),仅列出目录。输入感兴趣目录的绝对路径或相对路径,然后按Enter键进入感兴趣目录。现在,键入cd
并按Tab键。现在仅显示目录。
user@ubuntu:~/Desktop$cd <tab key>
上面的命令现在应该只显示Desktop中的文件夹。确实最短。
-d
实际含义。