gpt4 book ai didi

bash - 如何在 bash 中按字母顺序对查找结果(包括嵌套目录)进行排序

转载 作者:行者123 更新时间:2023-11-29 08:52:52 25 4
gpt4 key购买 nike

我有一个基于在 bash 中运行“查找”命令的结果的目录列表。例如,查找的结果是文件:

test/a/file
test/b/file
test/file
test/z/file

我想对输出进行排序,使其显示为:

test/file
test/a/file
test/b/file
test/z/file

有没有办法在 find 命令中对结果进行排序,或者通过管道将结果排序?

最佳答案

如果你有 GNU 版本的 find,试试这个:

find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}'

要在循环中使用这些文件名,请执行

find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}' | while read file; do
# use $file
done

find 命令为每个文件打印三项内容:(1) 它的目录,(2) 它在目录树中的深度,以及 (3) 它的全名。通过在输出中包含深度,我们可以使用 sort -ntest/file 排序在 test/a/file 之上。最后,我们使用 awk 去除前两列,因为它们仅用于排序。

使用 \0 作为三个字段之间的分隔符允许我们处理其中包含空格和制表符的文件名(不幸的是,但不是换行符)。

$ find test -type f
test/b/file
test/a/file
test/file
test/z/file
$ find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F'\0' '{print $3}'
test/file
test/a/file
test/b/file
test/z/file

如果您无法修改 find 命令,请尝试这个复杂的替换:

find test -type f | while read file; do
printf '%s\0%s\0%s\n' "${file%/*}" "$(tr -dc / <<< "$file")" "$file"
done | sort -t '\0' | awk -F'\0' '{print $3}'

它做同样的事情,${file%/*} 用于获取文件的目录名,tr 命令用于计算文件的数量斜杠,相当于文件的“深度”。

(我当然希望那里有一个更简单的答案。你所问的似乎并不难,但我正在寻找一个简单的解决方案。)

关于bash - 如何在 bash 中按字母顺序对查找结果(包括嵌套目录)进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14491020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com