我有这个 shell 脚本,它列出了当前工作目录的所有子目录的名称。有什么方法可以对名称进行排序,以便名称中带有空格的目录首先出现,然后是其他目录?
这是我的脚本:
#! /bin/bash
#search for files in a given directory
for file in $*
do
ls -1p | tr '/' ' '
done
这是它创建的输出:
A7 Provided
a7q3.log
a7q4.log
A7 Starters
lsdir1.sh
lsdir.sh
有没有办法创建一个看起来像这样的输出
A7 Provided
A7 Starters
a7q3.log
a7q4.log
lsdir1.sh
lsdir.sh
答案1
排序顺序由以下因素决定LC_COLLATE
语言环境设置。大多数语言将排序规则设置为类似于字典的顺序:第一轮排序不区分大小写,并忽略非字母数字字符(例如空格)。将排序规则更改为C
,严格按代码点排序,因此空格位于所有可打印字符之前,所有拉丁大写字母位于所有其他字母之前,等等。
LC_COLLATE=C ls -1
或者
LC_ALL=C.utf8 ls -1
脚本中的很多内容没有意义(循环遍历单词列表和参数的扩展模式;循环而不使用循环体中的循环变量;ls
以仅在末尾输出斜杠的方式进行调用)行,然后用空格替换该斜线)。我无法告诉你如何解决这个问题,因为我不知道你想做什么,但我可以告诉你这$*
应该是"$@"
因为很少有情况下$*
,"$*"
或 是$@
有意义的。
答案2
也许您想要一个自定义ls
函数,首先输出其中包含空格的文件名(如果有),然后输出不包含空格的文件名?下面的函数使用 bash 的extglob
shell 选项来启用通配符!(* *)
,这意味着“扩展到所有没有空格的文件名”。它还创建一个临时子 shell(在函数体中使用括号而不是大括号),以便 shell 的选项不会更改。
function ls() (
command ls -1 *' '* 2>/dev/null
shopt -s extglob
command ls -1 !(* *) 2> /dev/null
)
当然,您不必命名它ls
——(几乎)您喜欢的任何名称。