我想在任何目录中对 find 命令的输出进行唯一排序,而不需要重复的文件名。
find /path/to/first_directory/* /path/to/second_directory/* /path/to/third_directory/* -mtime -1 -name "filename_pattern*"
示例输出:
/path/to/first_directory/sample_file1_2017Dec25.dat
/path/to/first_directory/sample_file2_2017Nov01.dat
/path/to/first_directory/sample_file3_2017Oct08.dat
/path/to/first_directory/archive/sample_file1_2017Dec25.dat.Z
/path/to/first_directory/archive/sample_file2_2017Nov01.dat.Z
/path/to/second_directory/sample_file4_2017Sep11.dat
/path/to/second_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file1_2017Dec25.dat
/path/to/third_directory/sample_file2_2017Nov01.dat
/path/to/third_directory/sample_file3_2017Oct08.dat
/path/to/third_directory/sample_file4_2017Sep11.dat
/path/to/third_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file6_2017July04.dat
/path/to/third_directory/sample_file6_2017June12.dat
/path/to/third_directory/sample_file7_2017May01.dat
从输出中您可以看到 and 中有重复的文件名,/first_directory/
并且/first_directory/archive/
所有文件都来自/first_directory/*
and/second_directory/*
也在 inside 中/third_directory/*
。意思就是说/third_directory/*
是和中找到的所有文件的归档目录,/first_directory/*
但/second_directory/*
也有只能在/third_directory/*
( check sample_file6
and sample_file7
)中找到的文件
我想要打印的是按此顺序从/first_directory/
到/first_directory/archive/
到/second_directory/
到的文件/third_directory/
,没有重复,并且还按日期排序。
期望的输出:
/path/to/first_directory/sample_file1_2017Dec25.dat
/path/to/first_directory/sample_file2_2017Nov01.dat
/path/to/first_directory/sample_file3_2017Oct08.dat
/path/to/second_directory/sample_file4_2017Sep11.dat
/path/to/second_directory/sample_file5_2017Oct05.dat
/path/to/third_directory/sample_file6_2017July04.dat
/path/to/third_directory/sample_file6_2017June12.dat
/path/to/third_directory/sample_file7_2017May01.dat
如果您的 find 命令的输出保存在名为 的文件中
filelist
,请尝试:如果你想在不创建文件的情况下做同样的事情:
或者,您更喜欢将命令分散到多行中,使用:
我们添加
\
到第一行末尾的地方,因为那是 bash 的行继续字符。因为第二行以 结尾|
,所以不需要续行符。这个怎么运作
find
首先,按照您的优先顺序在命令中列出目录很重要。我看到你已经这样做了。-F/
这告诉 awk
/
用作字段分隔符。这意味着文件名将是最后一个字段,$NF
.f=$NF; sub(/\.Z$/,"",f)
这会将文件名分配给变量
f
,然后如果存在则.Z
从中删除最终名称。f
!a[f]++'
如果
f
以前没有见过,打印这一行。更新 1:删除其他扩展
根据评论,
.Z
不是唯一需要删除的扩展。可能还有其他扩展名.dat.edi
,.dat.bak
应该用简单.dat
的 . 在这种情况下:更新 2:显示按时间戳排序的文件: