如何首先使用目录列出文件和目录


22

我有两个问题。首先,哪个命令列出文件和目录,但首先列出目录?

第二个问题:我想将文件列表复制到一个目录中,但是将目标目录作为命令中的第一个文件名。


5
ls有一个--group-directories-first开关。
jasonwryan 2011年

1
-t是一个可能的仅GNU选项,cp该选项需要一个显式的目标目录,因此可以在命令行中的任何位置(包括开头)进入。
jw013 2011年

Answers:


36

有GNU吗?

GNU版本ls都有--group-directories-first。并且cp-t

没有GNU?

在没有gnu的系统上ls,最好的选择是连续两次调用findwith -maxdepth n/ -mindepth n-type t适当的选项。

find . -maxdepth 1 -mindepth 1 -type d
find . -maxdepth 1 -mindepth 1 \! -type d

对于复制文件,首先要复制目标,您必须编写一个脚本,该脚本保存第一个参数,然后使用shift,并将参数附加到末尾。

#!/bin/sh
target="$1"
shift
cp -r -- "$@" "$target"

小心!

如果您打算一起使用这些文件,即从findls(可能使用xargs)收集列表并将其传递给cp(或cp包装器),则应了解解析文件列表的危险(基本上,文件名可以包含换行符之类的字符,可能会弄乱您的脚本)。具体来说,请查看find-exec-print0选项以及xargs-0选项。

一种有效复制目录树的替代工具。

您可能想研究使用rsync;它具有许多功能,可能会使您的工作更轻松。


这很棒。更笼统地说,有什么办法知道我是否有GNU版本?(除了尝试该选项--group-directories-first)。
阿梅利奥·瓦兹克斯·雷纳

3
您可以运行ls --version以找出您拥有的那个。
肖恩·高夫

6

首先列出非GNU的目录ls

ls -l | sort

注意,这将列出所有其他奇怪的东西,例如符号链接,套接字和管道(当然,适当地分组),但是考虑到这些东西很少见,这应该不是问题。否则过滤器将是ls -l | grep '^(-|d)' | sort


1
+1聪明,比接受的答案短。除了确实应该这样sort -r
PythonNut 2014年

1
ls -l | 在Mac上,排序对我不起作用。它首先对目录进行分组,但没有对它们进行排序,也没有对随后的文件名进行排序。

另请注意:使用`| sort`会删除您的颜色,因为它现在是文本。
JayRizzo

4

适用于bashzsh

只需在〜/ .bashrc或〜/ .zshrc中添加别名

# Colorize the ls output ##
alias ls='LC_COLLATE=C ls -h --group-directories-first --color=auto'

另外,如果您拥有ZSH,则可以使用“ k”实用程序

k -h --group-directories-first

在此处输入图片说明

只需将其与抗原一起安装,只需将以下内容放入〜/ .zshrc

antigen bundle reduxionist/k --branch=add-sort-options

1
提供别名的好答案。
рüффп

0

对于zsh的完成列表,您可以将list-dirs-first样式设置为true,以便首先显示目录。在您的~/.zshrc

zstyle ':completion:*' list-dirs-first true

(此处适用于支持它的所有完成窗口小部件以及所有命令;可以根据需要进行限制,请参阅zstyle文档以获取详细信息)

如果您还没有这样做,请确保同时运行compinstall以获取彩色的完成列表,说明等以及所有其他优点。


0

对于非GNU,awk可以过滤所有其他字段:

ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
  • NF == 9:的输出ls -l必须包含9个字段
  • 如果行以“ d”开头,则打印一个额外的“ /”
  • 否则只是文件名

输出看起来像,ls -1但是目录放在最前面:

node_modules/
src/
e2e/
angular.json
tslint.json
package.json
README.md

根据ls手册页的“长格式”,当涉及其他文件类型时,输出顺序应为:

   s     Socket link.
   p     FIFO.
   l     Symbolic link.
   d     Directory.
   c     Character special file.
   b     Block special file.
   -     Regular file.

一个方便的bash函数(将其放入您的.bash_profile或.bashrc中):

function l1() {
  ls -l $* | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.