我有两个问题。首先,哪个命令列出文件和目录,但首先列出目录?
第二个问题:我想将文件列表复制到单个目录中,但将目标目录作为命令中的第一个文件名。
答案1
有 GNU 吗?
gnu 版本ls
有--group-directories-first
.并且cp
有-t
。
没有GNU?
在没有 gnu 的系统上ls
,最好的选择是find
使用-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
's-exec
和-print0
options 以及xargs
's-0
选项。
用于高效复制目录树的替代工具。
您可能想考虑使用rsync
反而;它有很多功能可以让您的工作更轻松。
答案2
效劳于巴什和桀骜
只需在 ~/.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
答案3
首先列出非 GNU 的目录ls
:
ls -l | sort
请注意,这将列出所有其他奇怪的东西,如符号链接、套接字和管道(当然,适当分组),但考虑到这些东西相当罕见,这不应该成为问题。否则过滤器将是ls -l | grep '^(-|d)' | sort
答案4
我的版本带有彩色文件夹和文件名,基于 @clarkttfu 的解决方案并进行了一系列改进。在 MacOS 上测试。
ls -lh | sort -r | awk 'NF==9 { if ($1~/^d/) { printf $1 "/" $2 "/" $3 "/" $4 "/" $5 "/" $6 " " $7 "/" $8 " " "\033[1;34m" $9 "\033[0m" "\n" } else { printf $1 "/" $2 "/" $3 "/" $4 "/" $5 "/" $6 " " $7 "/" $8 " " "\033[1;32m" $9 "\033[0m" "\n" } }' | column -t -s"/"
或创建一个别名:
alias ll='ls -lh | sort -r | awk '\''NF==9 { if ($1~/^d/) { printf $1 "/" $2 "/" $3 "/" $4 "/" $5 "/" $6 " " $7 "/" $8 " " "\033[1;34m" $9 "\033[0m" "\n" } else { printf $1 "/" $2 "/" $3 "/" $4 "/" $5 "/" $6 " " $7 "/" $8 " " "\033[1;32m" $9 "\033[0m" "\n" } }'\'' | column -t -s"/"'