按字母顺序对终端中的文件夹进行排序

按字母顺序对终端中的文件夹进行排序

我创建了一个循环来转到每个目录,以便它执行命令。但我注意到文件夹中的条目不是按字母顺序排列的。

循环是这样的:

#1/
#10/
#11/
#12/
#13/
#14/
#15/
#16/
#17/
#18/
#19/
#2/
#20/
#3/
#4/
#5/
#6/
#7/
#8/
#9/
...

但你必须:

#1/
#2/
#3/
#4/
...

我的剧本

for d in */; do echo "$d"; (cd "$d" && ls); done;

答案1

如果您想保留简单的方法和文件夹,您可以按数字位数分隔:

for d in ?/;  do echo "$d"; (cd "$d" && ls); done
for d in ??/; do echo "$d"; (cd "$d" && ls); done

这种重复的代码当然不太好。但话又说回来,你根本没有给出任何上下文,除了“你必须#1 #2 #3”。

或者可能:

for d in {1..20}; do echo "$d"; (cd "$d" && ls); done

(也可以在 后面加上斜线{1..20}/

仅当您将所有数字都作为文件夹时,这才有意义。

答案2

他们按字母顺序排列。按字母顺序排列,2出现在之后,10因为2出现在之后1,就像B出现在之后一样AB。在这里你想要一个数值顺序而不是字母顺序。

为此,请确保您使用zshshell(应该是最新版本的 macos 中的默认用户 shell)并使用:

for d in *(N/n); do (cd -- $d && print -r -- $d && ls); done

或者使用缩写形式:

for d (*(N/n)) (cd -- $d && print -r -- $d && ls)

(N/n)部分是全局限定符

  • N: 如果没有匹配项,则扩展为空,而不是报告错误(nullglob为该 glob 启用选项)。
  • /:仅选择类型的文件目录
  • n:切换 glob 扩展的数字排序(numericglobsort为该 glob 启用选项)。

如果您发现自己通常更喜欢该顺序,您也可以打开numericglobsort全局 ( set -o numericglobsort),然后您可以重新使用您的for d in */; ....

请注意,*(/)与 并不完全相同*/*(/)扩展到所有类型的文件目录,同时*/选择文件类型目录或者目录的符号链接并附加 a /,所以*/更像是*(-/M)-glob 限定符使后续限定符适用符号链接解析,并且M标记目录类型的文件(此处在符号链接解析之后)/

答案3

你可以这样做:

for d in $(find * -type d | sort -g); do echo "$d";(cd "$d" && ls);done;

相关内容