Answers:
以下命令将首先列出目录,然后列出普通文件,然后列出链接。
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
同样,为该命令创建别名以保存击键也很有意义。
编辑:
如果先要目录,然后再要不是目录的所有内容,请使用以下命令:
ls -la | grep "^d" && ls -la | grep -v "^d"
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"
?
alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
ls -la|grep ^d;ls -la|grep -v ^d
(引号并不是必须的和更换&&
用;
)。另一种选择是引入一个变量,然后评估它:a="ls -la|grep ^d";eval $a;eval $a -v
。当为ls
/ 指定更多选项时,可能有助于避免重复grep
。还有一个ls -la --group-directories-first
选择,但是最短的imo是ls -la|sort
我非常喜欢* nix,也喜欢看到其中一些回复所具有的创造力...
我的在GNU Linux上并不那么喜欢:
alias ls='ls --color -h --group-directories-first'
鉴于我对linux CLI应用程序更加满意,因此我也倾向于在OSX上更新coreutils:
brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
brew install bash
它!:)
对于Mac用户coreutils:
brew install coreutils
alias ls='ls --color -h --group-directories-first'
假设您的系统已准备好进行自制程序:
gls
而是。对?
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
。
我想在目录列表中看到某些内容,到目前为止,这里的答案都不能满足以下所有要求。我对目录清单的要求:
./
和../
),文件和链接--group-directories-first
Windows的Git Bash中不方便的便捷选项经过大量的修改后,我终于想到了我满意的单线(尽管行很长;-)。我已将其分配给名为“ dir”的别名:
ls -dlF --color * .* | head -n2 && ls -AlF | LC_ALL=C grep "^d" |
LC_ALL=C sort -k 9df && ls -AlF | LC_ALL=C grep "^[l-]" |
LC_ALL=C sort -k 9df && echo -e `find -maxdepth 1 -type d ! -name . |
wc -l` Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f |
wc -l` File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- |
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l` Link\(s\)
为了使事情更易于管理,我提出了单独的命令来按喜好输出目录列表的每个部分,然后使用&&
运算符将它们组合在一起。
ls -dlF --color * .* | head -n2
-提取./
和../
。我们不希望传递这些信息,sort
因为它们已经按照正确的顺序排列了,对它们进行排序可能会导致它们../
首先被列出。该-d
选项是摆脱“总”线; 我想添加-F
以显示目录末尾的斜杠(当您执行无格式操作时,它也会在符号链接上标记“ @” ls -F
)。
ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df
-提取目录并按文件名(第9列)对它们进行排序,同时忽略非字母/空格字符(d
选项)和字符大小写(f
选项)。该ls -A
选项从列表中排除./
和../
,因为我们已经在上一步中将它们提取出来了。我倾向于在所有命令grep
和sort
命令之前加上LC_ALL=C
语言环境重置,以使(1)输出在Unix shell之间保持一致,并且(2)有时您会看到更快的性能,因为它不再需要繁重的UTF-8字符集处理。
ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df
-这与上面的步骤相似,但是这次我们正在对文件和符号链接进行排序。
find -maxdepth 1 -type d ! -name . | wc -l
-获取目录数量,不包括./
和../
。
find -maxdepth 1 -type f | wc -l
-获取文件数。
find -maxdepth 1 -type l | wc -l
-获取符号链接的数量。
du -hs | cut -f 1
-以易于阅读的格式提取所有子目录的总大小。
find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1
-以人类可读的格式提取所有文件的总大小。
让我们来看看我们的新dir
别名!
之前:
$ ls -alF
total 22
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
后:
$ dir
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
5 Dir(s) 2.8M 6 File(s) 31K 0 Link(s)
一个较小的缺点是您不能使用彩色列表,因为文件名周围的彩色控制字符会使排序过于不可靠。
更新
从深度文件系统的根目录执行上述别名时,速度很慢,因此,我将其更新为更简单但性能更高的命令:
ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'
样本输出:
$ dir
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom 0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom 0 Jun 16 2016 temp/
drwxr-xr-x 1 Tom 0 Jul 13 2016 vimfiles/
-rw-r--r-- 2 Tom 365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom 2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom 2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom 1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom 8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom 2444 Jul 13 2016 _vimrc
33819 bytes
由于新版本的Windows Git Bash支持--group-directories-first
,因此我们不再需要依靠sort
。即使新别名显示的信息不如以前的别名多,但性能提升还是值得的。作为一种振作,您还可以获得颜色!
您有几种选择,取决于您是否要保持字母顺序。
您可以尝试:
ls -al | 排序-k1 -r
或这样,以保持具有相同权限的文件的字母顺序:
ls -al | 排序-k1,1 -k9,9 -r
或者,如eleven81所说(但此版本列出了所有内容):
ls -la | grep“ ^ d” && ls -la | grep“ ^-” && ls -al | grep -v“ ^ [d |-]”
ls- al|sort -k1 -r
工作。所缺少的只是-r
国旗。
./
并../
不会是第一个两行的顺序。除此之外,我同意这是更有效的解决方案。
这是一个执行此操作的功能(bash或zsh):而且...我不建议这是最好的方法,但这是我想到并正在使用的方法:
功能lss { #显示目录列表,目录在顶部。 命令ls --color = always $ @ | egrep'^ d |总计' 命令ls --color = always $ @ | egrep -v'^ d | total'; }
ls -l
)来按这样的文件类型进行过滤。另外,此命令将在空格(以bash表示)上中断。您需要像这样引用:"$@"
如果您想使用这种方法,则可以这样做:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
ls -laX
会先按字母顺序显示目录,但会损坏文件列表。
长选项:
ls
-l # List
--all
-X # Sort alphabetically by entry extension
其他方式 ...
find . -d 1 -type d | ls -la | sort -r
要么
ls -la | sort -r
要么
d=`find . -type d -d 1`;f=`find . -type f -d 1`; echo -e -DIRS- "\n$d\n" -FILES- "\n$f"
alias ls='ls -lhF --color'
list_sorted() {
ls $* | grep "^d";
ls $* | grep "^-";
ls $* | grep -v -E "^d|^-|^total"
}
alias ll=list_sorted
我使用此处答案和评论中提供的解决方案的组合。
ls
首先,我覆盖以下行为的默认行为ls
:
-l
:始终将列表显示为一维垂直列表-h
:以易于阅读的方式显示文件大小(例如4.0K而不是4096)-F
:显示指示符,例如目录的结尾斜杠alias ls='ls -lhF --color'
ll
接下来,我编写一个包含排序逻辑的函数。对于每个ls
参数,我都会传递任何原始传递的参数。这样一来,我可以使用与要列出的工作目录不同的工作目录中的别名ls -a ~
。
同样,对的每个调用ls
都通过管道传递给grep
命令。在这里,进行排序。ls -l | grep "^d"
例如仅列出目录。如果应该首先列出目录,则该函数也必须放在第一位。接下来是文件。
最后,我显示了既不是目录又不是文件的所有内容(也没有显示目录内容总大小的行)。这是通过以下方式完成的:grepping Directoy,常规文件条目和总条目,然后通过-v
参数求反。
list_sorted() {
# List directories
ls $* | grep "^d";
# List regular files
ls $* | grep "^-";
# List everything else (e.g. symbolic links)
ls $* | grep -v -E "^d|^-|^total"
}
最后,我将该函数别名为一个新命令。特别是ls
在某些情况下我的功能中断时,我不想覆盖。然后,我希望能够使用ls
。另外,您始终可以ls
通过调用来调用非别名命令\ls
。
alias ll=list_sorted
;
而不是&&
命令的分隔符。否则,将无法列出不包含目录的目录内容(第一个ls命令的计算结果为false,因此不允许执行下一个命令,因为它与&&
。结合使用;
避免了这种情况。)这是一个脚本解决方案。仅列出名称,没有索引节点数据,按字母顺序,不区分大小写,格式化为列。尽管它像ls的默认输出那样是行主行而不是列主行。如果文件名的字符数> 26,则各列会有些混乱。
rm -f /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
另外,还有一些额外的格式。
rm -f /tmp/lsout
echo " ---- Directories ---- " >> /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
rm -f /tmp/lsout
echo " ------- Files ------- " >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
减去颜色,最后一个输出如下所示:
---- Directories ---- archive/ bookmarks/
Desktop/ Documents/ Downloads/
fff/ health/ Library/
Movies/ Music/ Pictures/
Public/ rrf/ scifi/
testdir/ testdir2/
------- Files ------- @todo comedy
delme lll maxims
schedule vtokens style
只要记住不要为该别名加上别名或更改ls的默认行为,因为此脚本会对其进行调用。
-
前先d
出现了sort