我想对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
从输出中,你可以看到,在重复的文件名/first_directory/
,并/first_directory/archive/
还从所有文件/first_directory/*
和/second_directory/*
也内/third_directory/*
。这意味着/third_directory/*
是所有文件的存档目录中发现的/first_directory/*
和/second_directory/*
,但也有只能在被找到的文件/third_directory/*
(检查sample_file6
和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
,请尝试:
$ awk -F/ '{f=$NF; sub(/\.Z$/,"",f)} !a[f]++' filelist
/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 /path/to/first_directory/* /path/to/second_directory/* /path/to/third_directory/* -mtime -1 -name "filename_pattern*" | awk -F/ '{f=$NF; sub(/\.Z$/,"",f)} !a[f]++'
或者,您更喜欢将命令分布在多行中,请使用:
find /path/to/first_directory/* /path/to/second_directory/* \
/path/to/third_directory/* -mtime -1 -name "filename_pattern*" |
awk -F/ '{f=$NF; sub(/\.Z$/,"",f)} !a[f]++'
我们将其添加\
到第一行末尾的位置,因为那是bash的行连续字符。因为第二行以结尾|
,所以不需要行继续符。
首先,find
按照优先级顺序在命令中列出目录很重要。我知道您已经做到了。
-F/
这告诉awk/
用作字段分隔符。这意味着文件名将是最后一个字段$NF
。
f=$NF; sub(/\.Z$/,"",f)
这会将文件名分配给变量f
,然后.Z
从中删除最后一个(f
如果存在)。
!a[f]++'
如果f
以前没有看到过,请打印此行。
根据评论,.Z
不是唯一需要删除的扩展名。可能有其他的扩展.dat.edi
,并.dat.bak
应与简单地更换.dat
。在这种情况下:
awk -F/ '{f=$NF; sub(/\.dat.*/,".dat",f)} !a[f]++' filelist
awk -F/ '{f=$NF; sub(/\.dat.*/,".dat",f)} !a[f]++' filelist | xargs -d'\n' -r ls -t
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句