按文件名排序查找命令

Sorting find command by filename

我希望仅按文件名而不是整个路径的字母顺序对查找命令的输出进行排序。

假设我有一堆文本文件:

./d/meanwhile/in/b.txt
./meanwhile/c.txt
./z/path/with/more/a.txt
./d/mored/dddd/d.txt

我正在寻找输出:

./z/path/with/more/a.txt
./d/meanwhile/in/b.txt
./meanwhile/c.txt
./d/mored/dddd/d.txt

我试过:

find . -type f -name '*.txt' -print0 | sort -t
find . -name '*.txt' -exec ls -ltu {} \; | sort -n
find . -name '*.txt' | sort -n

...以及其他排列。

最直接的方法是在两列中打印每个文件(记录)——文件名和路径——用一些肯定不会出现在文件名中的字符分隔(-printf '%f\t%p\n'),然后对输出进行排序仅在第一列 (sort -k1),然后去除第一列 (cut -d$'\t' -f2):

find . -type f -name '*.txt' -printf '%f\t%p\n' | sort -k1 | cut -d$'\t' -f2

请注意,这里我们使用 \t(制表符)和 \n(换行符)作为字段和记录分隔符,假设它们不会作为任何文件名的一部分出现。