我从基本文件夹运行以下内容./
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命令下尝试了几个不同的开关,但没有运气。我总是可以将所有内容复制到一个文件夹并从那里排序,但是有几百个文件,我希望存在更优雅的选项。
谢谢!感谢您的帮助。
答案 0 :(得分:5)
如果您的find
有-printf
,则可以打印基本文件名和完整文件名。按第一个字段排序,然后将其剥离。
find . -name '*.xvi.txt' -printf '%f %p\n' | sort -k1,1 | cut -f 2- -d ' '
我选择了一个空格作为分隔符。如果您的文件名包含空格,则应选择另一个分隔符,该分隔符是不在您的文件名中的字符。如果任何文件名包含换行符,则必须对其进行修改,因为它不起作用。
请注意,应引用find
命令中的glob。
答案 1 :(得分:1)
如果您的find
没有printf
,您可以使用awk
来完成同样的事情:
find . -name *.xvi.txt | awk -F / '{ print $NF, $0 }' | sort | sed 's/.* //'
丹尼斯·威廉姆森提到的关于空间的相同警告适用于此。对于多样性,我使用sed
去除排序字段,而不是cut
。
答案 2 :(得分:0)
find . -name *.xvi.txt | sort -t'.' -k3 -n
会根据需要对其进行排序。唯一的问题是文件名或目录名是否包含附加点。
为避免这种情况,您可以使用:
find . -name *.xvi.txt | sed 's/[0-9]\+.xvi.txt$/\\&/' | sort -t'\' -k2 | sed 's/\\//'