如何按空白字符排序

如何按空白字符排序

我有这个 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 的extglobshell 选项来启用通配符!(* *),这意味着“扩展到所有没有空格的文件名”。它还创建一个临时子 shell(在函数体中使用括号而不是大括号),以便 shell 的选项不会更改。

function ls() (
  command ls -1 *' '* 2>/dev/null
  shopt -s extglob
  command ls -1 !(* *) 2> /dev/null 
)

当然,您不必命名它ls——(几乎)您喜欢的任何名称。

相关内容