4

我从基本文件夹中运行了以下内容。/

find . -name *.xvi.txt | sort

它返回以下排序顺序:

./LT/filename.2004167.xvi.txt
./LT/filename.2004247.xvi.txt
./pred/2004186/filename.2004186.xvi.txt
./pred/2004202/filename.2004202.xvi.txt
./pred/2004222/filename.2004222.xvi.txt

如您所见,文件名遵循常规结构,但文件本身可能位于目录结构的不同部分。有没有办法忽略文件​​夹名称和/或目录结构,以便排序仅根据文件名本身返回文件夹/文件名列表?像这样:

./LT/filename.2004167.xvi.txt
./pred/2004186/filename.2004186.xvi.txt
./pred/2004202/filename.2004202.xvi.txt
./pred/2004222/filename.2004222.xvi.txt
./LT/filename.2004247.xvi.txt

我在 find 和 sort 命令下尝试了一些不同的开关,但没有运气。我总是可以将所有内容复制到一个文件夹并从那里进行排序,但是有数百个文件,我希望存在一个更优雅的选项。

谢谢!感谢您的帮助。

4

3 回答 3

6

如果您find-printf,您可以打印基本文件名和完整文件名。按第一个字段排序,然后将其删除。

find . -name '*.xvi.txt' -printf '%f %p\n' | sort -k1,1 | cut -f 2- -d ' '

我选择了一个空格作为分隔符。如果您的文件名包含空格,您应该选择另一个分隔符,它是一个不在您的文件名中的字符。如果任何文件名包含换行符,则必须修改它,因为它不起作用。

请注意,find应引用命令中的 glob。

于 2012-07-10T14:10:37.630 回答
1

如果你find没有printf,你可以awk用来完成同样的事情:

find . -name *.xvi.txt | awk -F / '{ print $NF, $0 }' | sort | sed 's/.* //'

丹尼斯威廉姆森提到的关于空间的相同警告在这里也适用。为了多样化,我使用sed剥离排序字段,而不是cut.

于 2012-07-10T14:18:18.047 回答
0
find . -name *.xvi.txt | sort -t'.' -k3 -n

将根据需要对其进行排序。唯一的问题是文件名或目录名是否包含附加点。

为避免它,您可以使用:

find . -name *.xvi.txt | sed 's/[0-9]\+.xvi.txt$/\\&/' | sort -t'\' -k2 | sed 's/\\//'
于 2012-07-10T14:24:59.070 回答