我创建了一个循环来转到每个目录,以便它执行命令。但我注意到文件夹中的条目不是按字母顺序排列的。
循环是这样的:
#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
。在这里你想要一个数值顺序而不是字母顺序。
为此,请确保您使用zsh
shell(应该是最新版本的 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;