我有两个问题。首先,哪个命令列出文件和目录,但首先列出目录?
第二个问题:我想将文件列表复制到一个目录中,但是将目标目录作为命令中的第一个文件名。
-t
是一个可能的仅GNU选项,cp
该选项需要一个显式的目标目录,因此可以在命令行中的任何位置(包括开头)进入。
我有两个问题。首先,哪个命令列出文件和目录,但首先列出目录?
第二个问题:我想将文件列表复制到一个目录中,但是将目标目录作为命令中的第一个文件名。
-t
是一个可能的仅GNU选项,cp
该选项需要一个显式的目标目录,因此可以在命令行中的任何位置(包括开头)进入。
Answers:
GNU版本ls
都有--group-directories-first
。并且cp
有-t
。
在没有gnu的系统上ls
,最好的选择是连续两次调用find
with -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"
如果您打算一起使用这些文件,即从find
或ls
(可能使用xargs
)收集列表并将其传递给cp
(或cp
包装器),则应了解解析文件列表的危险(基本上,文件名可以包含换行符之类的字符,可能会弄乱您的脚本)。具体来说,请查看find
的-exec
和-print0
选项以及xargs
的-0
选项。
您可能想研究使用rsync
;它具有许多功能,可能会使您的工作更轻松。
--group-directories-first
)。
ls --version
以找出您拥有的那个。
首先列出非GNU的目录ls
:
ls -l | sort
注意,这将列出所有其他奇怪的东西,例如符号链接,套接字和管道(当然,适当地分组),但是考虑到这些东西很少见,这应该不是问题。否则过滤器将是ls -l | grep '^(-|d)' | sort
sort -r
。
对于zsh
的完成列表,您可以将list-dirs-first
样式设置为true
,以便首先显示目录。在您的~/.zshrc
:
zstyle ':completion:*' list-dirs-first true
(此处适用于支持它的所有完成窗口小部件以及所有命令;可以根据需要进行限制,请参阅zstyle
文档以获取详细信息)
如果您还没有这样做,请确保同时运行compinstall
以获取彩色的完成列表,说明等以及所有其他优点。
对于非GNU,awk可以过滤所有其他字段:
ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
ls -l
必须包含9个字段输出看起来像,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 } }'
}
ls
有一个--group-directories-first
开关。